为什么推荐的 QDialog 实例化是这样的
Why is the recommended QDialog instantiation the way it is?
我有一个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();
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- 为什么推荐的 QDialog 实例化是这样的