Пользовательский QDialog Qt5 без использования Qt Creator - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь написать собственный чистый C ++ QDialog, чтобы я мог создать базовый класс и наследовать его позже.Ниже приведен код, который показывает QLabel в QDialog:

"EDLController.h"

#ifndef EDLController_h
#define EDLController_h

#include <QDialog>

class EDLController : public QDialog {
    Q_OBJECT
public:
    EDLController(QWidget *parent = nullptr);
};
#endif

"EDLController.cpp"

EDLController::EDLController(QWidget *parent) : QDialog(parent) {
    QVBoxLayout vBoxLayout;

    QLabel label("text");
    vBoxLayout.addWidget(&label);

    setLayout(&vBoxLayout);
    setWindowTitle("test");
}

"main.cpp "

int main(int argc, char *argv[]) {    
    QApplication app(argc, argv);

    EDLController *w = new EDLController();
    w->show();
    return app.exec();
}

Однако отображается пустое окно с правильным заголовком: image

Программа работает на Raspberry Pi (Raspbian).Может кто-нибудь помочь мне выяснить проблему.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

vBoxLayout и label будут уничтожены при выходе из конструктора EDLController, поскольку они являются локальными переменными.Создайте новые экземпляры в куче, чтобы избежать этого:

EDLController::EDLController(QWidget *parent)
    : QDialog(parent)
{
    QVBoxLayout * vBoxLayout = new QVBoxLayout(this);
    QLabel * label = new QLabel(this);
    label->setText("test");
    vBoxLayout->addWidget(label);

    setLayout(vBoxLayout);
    setWindowTitle("test");
}
0 голосов
/ 25 июня 2018

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


class MyLabel : public QLabel
{
    Q_OBJECT
public:
    MyLabel(const QString& str, QWidget* parent = nullptr) : QLabel(str,parent){}
    ~MyLabel() {qDebug() << "LABEL DELETED";}
};

Сообщение "LABEL DELETED" будет зарегистрировано при создании экземпляра QDialog. И, конечно, вы не можете отобразить удаленный виджет.

Правильный код следующий:


 QLabel* label = new  QLabel("text");
 vBoxLayout.addWidget(label);

Метка будет уничтожена, когда родительский элемент (ваш диалог) будет уничтожен.

...