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

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

要创建新的“窗口”,我在Qt-Creator中打开“创建新文件”对话框,然后选择Qt Designer表单类,该类创建所需的头文件,源文件和ui文件(dialogabout.h,dialogabout.cpp,dialogabout.ui) )。

如果我遵循docs,那么我将像这样打开QDialog:

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

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

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();

然后,connect语句和qDebug起作用。

我的问题是:偏离文档建议的创建对话框的方式有哪些陷阱?有没有一种方法可以使用先前的实例化方法获得此功能?

最佳答案

请注意,DialogAbout与Ui::DialogAbout不同。 Ui::DialogAbout是放置在UI namespace 中的一类构建,由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::DialogAbout在其中构建布局。请注意,Ui::DialogAbout具有在QDialog中创建组件的功能。
QDialog * widget = new QDialog;
Ui::DialogAbout about_ui;
about_ui.setupUi(widget);
widget->exec();

如果您将QDialog专用于DialogAbout,则代码应如下所示:
DialogAbout * widget = new DialogAbout();
Ui::DialogAbout about_ui;
about_ui.setupUi(widget);
widget->exec();

但是由于setupUi()已经在DialogAbout中,因此无法再次调用,结果是:
DialogAbout * widget = new DialogAbout();
widget->exec();

10-08 08:32