我有一个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();