我试图编写一个自定义的纯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)上运行。谁能帮我找出问题所在。
答案 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
构造函数退出时, 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");
}