为什么推荐的 QDialog 实例化是这样的

Why is the recommended QDialog instantiation the way it is?

本文关键字:实例化 QDialog 为什么      更新时间:2023-10-16

我有一个Qt Widgets应用程序,在Qt-Creator中创建和编辑。

主窗口(MainWindow 类)有一个菜单栏,带有一个用于打开小对话框的按钮(带有用于设置的文本或小部件)。

要创建一个新的"窗口",我在Qt-Creator中打开"创建新文件"对话框,然后选择Qt Designer Form Class,这将创建所需的标头,源和UI文件(dialogabout.h,dialogabout.cpp,dialogabout.ui)。

如果我按照文档进行操作,我会像这样打开 QDialog:

QDialog * widget = new QDialog;
Ui::DialogAbout about_ui;
about_ui.setupUi(widget);
widget->exec();

这有效,但是如果我修改新对话框的实例化器以将按钮连接到关闭信号,则永远不会到达连接语句(以及那里的任何其他代码)。

DialogAbout::DialogAbout(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogAbout)
{
    ui->setupUi(this);
    qDebug() << "I'm alive!"; // No output happens
    connect(ui->pushButton_close, SIGNAL(clicked(bool)), this, SIGNAL(please_close())); // No signal created on pushbutton click.
}

我怀疑这是因为我没有明确地做widget = new DialogAbout(this).如果我以不同的方式实例化新对话框:

DialogAbout * newwindow;
newwindow = new DialogAbout(this);
newwindow->exec();

然后连接语句和 qDebug 工作。

我的问题是:偏离文档推荐的创建对话框方式的陷阱是什么?有没有办法使用先前的实例化方法获得此功能?

请注意,DialogAbout 与 Ui::D ialogAbout 不同。Ui::D ialogAbout 是放置在 UI 命名空间中的一类构建,由 uic 自动创建。在项目中,此文件的名称应为"ui_dialogabout h"。

class Ui_DialogAbout
{
public:
    QPushButton *pushButton_close;
    void setupUi(QDialog *DialogAbout)
    {
        ...
    } // setupUi
    void retranslateUi(QDialog *DialogAbout)
    {
        ...
    } // retranslateUi
};
namespace Ui {
    class DialogAbout: public Ui_DialogAbout {};
} // namespace Ui

在这里,您使用一个类QDialog并使用Ui::D ialogAbout在其中构建布局。请注意,Ui::D ialogAbout 具有在 QDialog 中创建组件的功能。

QDialog * widget = new QDialog;
Ui::DialogAbout about_ui;
about_ui.setupUi(widget);
widget->exec();

如果你专门使用QDialog的对话框关于你的代码应该看起来像这样:

DialogAbout * widget = new DialogAbout();
Ui::DialogAbout about_ui;
about_ui.setupUi(widget);
widget->exec();

但是由于setupUi()已经在DialogAbout中,你不能再次调用,导致:

DialogAbout * widget = new DialogAbout();
widget->exec();