Qt5自定义QDialog不使用qt创建器

时间:2018-06-25 11:43:16

标签: c++ qt5 raspbian

我试图编写一个自定义的纯C ++ QDialog,以便我可以创建一个基类并在以后继承它。以下是在QDialog中显示QLabel的代码:

“ 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 :(得分:0)

问题是您的标签声明。您创建的本地变量标签在EDLController构造函数的末尾被销毁。 您可以通过继承QLabel来确认这一点:


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

实例化QDialog时,将记录“ LABEL DELETED”消息。 而且,当然,您无法显示已删除的小部件。

正确的代码如下:


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

当父项(您的对话框)被破坏时,标签将被销毁。

答案 1 :(得分:0)

vBoxLayout构造函数退出时,

labelEDLController将被销毁,因为它们是局部变量。在堆上创建新实例可避免这种情况:

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");
}