LINUX.ORG.RU

QT 5.8 не генерит исходники из ui файла

 


0

1

Проблема следующая, в книжке по QT(старой версии, 4 вроде бы) описано что можно и нужно из ui файла генерить хотя бы .h файл, чтобы использовать весь функционал, да и наследовать там что-то можно, вот строки оттуда:

Now run qmake to create a .pro file and a makefile (qmake -project; qmake gotocell.pro). The qmake tool is smart enough to detect the user interface file gotocelldialog.ui and to generate the appropriate makefile rules to invoke uic, Qt's user interface compiler. The uic tool converts gotocelldialog.ui into C++ and puts the result in ui_gotocelldialog.h.

Но этот хедер не создается так просто, пытался сделать подобное и на винде и вот на Федоре, результат один и тот же. Я конечно нашел как пофиксить, на второй страницы гугла форум на китайском языке где сплошные иероглифы, но советуют добавить вот это в pro файл:

QT += widgets

Только после этого я увидел .h файл. Причем ни в официальной документации, вообще нигде это не описано.

Если я не мог найти эту проблему в гугле, то значит либо я что-то делаю не так, либо этот функционал устарел и не нужен никому. Может кто-то подсказать что-нибудь на этот счет? Может вообще забить на эти хедер файлы и пользоваться остальным функционалом?

Ну и в Qt 4 виджеты были в составе модуля gui и включать их явно было не нужно

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ну в этой книге описывается создание диалоговых окон, ну и насколько я понимаю подразумевается что этот диалог можно позже прикрутить к виджету. В общем-то выглядит как полезный функционал, чтобы к готовому виджету подключать разные диалоги и пользоваться всякими приблудами ООП. Вот и меня и смущает что это слишком болезненно настраивается и в гугле инфы по этому поводу вообще нет.

Kronick
() автор топика
Ответ на: комментарий от Kronick

в гугле инфы по этому поводу вообще нет

Вы просто не стали читать документацию, идущую с Qt5! Почитайте хотя бы раздел «Getting Started Programming with Qt Widgets». И в гугле полно информации про портирование с Qt4 на Qt5.
В следующий раз возьмите книжку про Qt3 - там вас еще большие сюрпризы поджидают при попытке выполнить примеры в qt5!

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)

Ты мог бы клепать интерфейс «в коде», но для простоты тебе дают помощь - UI-файлы. Можно всё делать и без UI, но с ними нагляднее и проще.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Это-то я понимаю, я даже нашел что в той же форме можно найти имя объекта и его использовать в коде, с этим нет проблем. Но вот в тестовых примерах на основе этого ui файла создается примерно такой хедер:

class Ui::GoToCellDialog
{
public:
QLabel *label;
QLineEdit *lineEdit;
QSpacerItem *spacerItem;

А после этого мы используем его в качестве родительского класса в другом файле:

#include <QDialog>
#include "ui_gotocelldialog.h"

class GoToCellDialog : public QDialog, public Ui::GoToCellDialog
{
Q_OBJECT
public:
GoToCellDialog(QWidget *parent = 0);

Ну и соответственно если у меня не генерится этот хедер, то и дальше я не могу его наследовать и делать include этого хедера.

Вот это-то меня с толку и сбивает, уже думаю забить на эту книжку и делать по официальной документации

Kronick
() автор топика
Ответ на: комментарий от sigurd

Пожалуй и в самом деле почитаю официальную документацию и примеры поразбираю. Один только вопрос - такая генерация заголовочных файлов из ui файлов вообще используется где-нибудь в работе или в реальных проектах?

Kronick
() автор топика
Ответ на: комментарий от Kronick

Один только вопрос - такая генерация заголовочных файлов из ui файлов вообще используется где-нибудь в работе или в реальных проектах?

есть такой проект - называется qtcreator
ты его видимо и не запускал, а то он бы избавил тебя он вызова qmake вручную

x905 ★★★★★
()
Ответ на: комментарий от ncuxer

Хорошо, может быть есть какие-то мысли на счет того, что у меня не появляется этот самый хедер? Сейчас все делаю по официальной документации, вот даже в самом исходнике подключается этот хедер:

#include "notepad.h"
#include "ui_notepad.h"

Notepad::Notepad(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Notepad)
{

    ui->setupUi(this);
}

То есть он подключается по всей видимости, но в папке с проектом его нет и как заглянуть внутрь его я не понимаю. Он вроде бы не темповый, даже при запущенном приложении этого файла я не наблюдаю.

Kronick
() автор топика
Ответ на: комментарий от x905

Ну я через qtcreator все и делаю, когда увидел что файла нет - то запускал вручную, что на винде, что на линуксе, результата опять же никакого.

Kronick
() автор топика
Ответ на: комментарий от Kronick

просто используй Qt Creator и никаких толков у тебя сбиваться не будет

ты что, пытался писать на Qt без Qt Creator-а, который сам тебе эти UI файлы лепит генерит и прописывает???

книга может и полезна, но начни с простого GUI приложения в Qt Creator и не делай вручную этого

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Ну я пытался делать по инструкции, копировал ui файл из другого проекта в новую директорию, создавал там main.cpp файл, дальше руками запускал qmake -project;qmake $project.

Kronick
() автор топика
Ответ на: комментарий от Kronick

Ну я через qtcreator все и делаю

Неправильно ты дядя Федор креатор используешь, надо так: Файл-Новый файл или проект-Приложение-Приложение Qt Widgets-Выбрать-NextNext...-Запустить. Вот тебе и окошко и UI и всё работает.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Kronick

Что-то вы перемудрили, .ui-файл — это просто .xml, хедер из него генерится утилитой uic. qmake запускает uic как один из этапов сборки проекта до компиляции, поэтому сгенерённый хедер доступен при сборке. Если компиляешь в qtcreator вся эта кухня заводится автоматически. Если компиляешь ручками, вызывай uic сам.

fluorite ★★★★★
()
Ответ на: комментарий от Kronick

Для того, чтобы qmake понял, что надо натравить uic на ui файлы, они должны быть в .pro перечислены в FORMS, например:

FORMS += yourfirst.ui yoursecond.ui 

fluorite ★★★★★
()
Ответ на: комментарий от Kronick

class GoToCellDialog : public QDialog, public Ui::GoToCellDialog

Так никто не делает. Надо так:

// header file
namespace Ui {
class GoToCellDialog;
}

class GoToCellDialog : public QDialog
{
   Q_OBJECT
public:
   GoToCellDialog(QWidget* pParent = 0);
   ~GoToCellDialog();
private:
   std::unique_ptr<Ui::GoToCellDialog> mpUi;
};

// cpp file
GoToCellDialog::GoToCellDialog(QWidget* pParent) :
   QDialog(pParent),
   mpUi(std::make_unique<Ui::GoToCellDialog>())
{
   ...
}

GoToCellDialog::~GoToCellDialog()
{
}
UVV ★★★★★
()
Последнее исправление: UVV (всего исправлений: 3)
Ответ на: комментарий от UVV

Интересно, спасибо. Я сейчас попробовал к готовому проекту добавить новый диалог из готовых темплейтов(с созданием класса), и мне сгенерился точно такой же код, за исключением 'std::unique_ptr'.

Судя по всему в новой версии они тот же функционал оставили, то есть наследовать можно, а вот сами .h файлы уже не просмотреть. Ну теперь все встает на свои места.

Kronick
() автор топика
Ответ на: комментарий от fluorite

Так он уже натравлен, вот сам файл, немного правда больше чем изначально, я тут ковыряюсь изо всех сил:

#-------------------------------------------------
#
# Project created by QtCreator 2017-05-23T11:18:06
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test8
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        mainwindow.cpp \
    dialogtest.cpp

HEADERS  += mainwindow.h \
    dialogtest.h

FORMS    += mainwindow.ui \
    dialogtest.ui

Так тут дело в том, что он эти хедеры генерит и внутри использует, а вот самих хедеров нету. Я как и писал в ОП, исправляется это только если добавить в pro файл следующую строку:

QT += widgets

И вот только после этого в папке появляются хедер файлы. Но похоже на то, что это в новой версии никого особо не интересует, так как в работе это особо и не нужно, все и так знают что там лежит.

Kronick
() автор топика
Ответ на: комментарий от Kronick

ты что-то неправильно понял. Заголовки как генерировались, так и генерируются. Только теперь они находятся в build directory.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Ах вот оно что, нашел-таки:

/home/test/build-test8-Desktop_Qt_5_8_0_GCC_64bit-Debug/ui_dialogtest.h

Так вот оно где находится, спасибо, теперь я понял как оно работает. Наконец-то все встало на свои места.

Kronick
() автор топика
Ответ на: комментарий от Kronick

Это же не для embedded, кстати? Для embedded я б смотрел в сторону qml, хоть и ни разу не трогал сам его ещё..

UVV ★★★★★
()
Ответ на: комментарий от UVV

Ну мне это для десктопа, буду делать десктопные приложения.

Кстати раз уж разговор зашел, мне нужно будет в перспективе сделать приложение, где будет доска приблизительно 50х50 элементов, что-то вроде шахматной доски, и по ней будут двигаться фигуры. Может подскажете чем именно это можно отрисовывать, ну и чем лучше такое делать? Я уже вижу море вариантов, это и обычный виджет, на котором просто рисуем через Brush, это и GraphicScene, это и OpenGL. Вариантов куча и как-то глаза разбегаются, не знаю даже за что браться.

Kronick
() автор топика
Ответ на: комментарий от UVV

Поглядел, даже примеры прощелкал некоторые, суть подходит, но сам язык QML меня не интересует, хочется C++. Но за наводку спасибо, я научился открыть демки в QTCreator, прекрасно, там же есть все что мне нужно, живые примеры.

Kronick
() автор топика

В общем всем спасибо, с проблемами разобрался и много всего нового узнал.

Kronick
() автор топика
Ответ на: комментарий от Unicode4all

Ну вообще ничего не мешает, но можно ведь сделать и стандартными средствами плюсов все что нужно, красота мне ни к чему. Ну к тому же и так очень много всего нового в чем нужно разобраться, сначала разберусь с базовыми вещами, а потом уже и вернусь и к QML и к OpenGL и ко всему подобному.

Kronick
() автор топика
Ответ на: комментарий от Kronick

ui_ файл создаётся в рантайме когда ты собираешь проект утилитой make. qmake его не создаёт.

former_anonymous ★★★
()
Ответ на: комментарий от Kronick

Ну и соответственно если у меня не генерится этот хедер, то и дальше я не могу его наследовать и делать include этого хедера.

Без QT += widgets у тебя компиляция должна сломаться уже на строчке #include <QDialog>

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.