[英]C++ How does Qt work?
我试图弄清楚如何从Ct项目中拥有的Qt Designer表单访问组件,没有编译错误,但是会发生运行时错误。
“ main”函数和a.exec如何工作? 我应该在a.exec()之前执行代码还是创建一个新线程来执行此操作?
QWidget *pWindow;
QPushButton *lpPushButton;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtProject w;
w.show();
pWindow = QApplication::activeWindow();
lpPushButton = pWindow->findChild<QPushButton*>("pushButton_2");;
lpPushButton->setText("test");
return a.exec();
}
pWindow和lpPushButton均为NULL
上面的代码不起作用,因为我不知道从哪里可以调用setText。 谢谢您,关于Eli5关于Qt的工作原理的一些解释会很棒。
使用QtDesigner创建表单时,它会将详细信息存储在xxx.ui
文件中,该文件必须添加到您的项目中。 它会在预编译步骤中编译为ui_xxx.h
文件,您必须将其包含在源文件中。
该头文件包含一个生成的类,其中包含所有小部件和布局代码,并将其放在名为Ui
的命名空间中。
您可以使用两个选项来使用此生成的类:可以从其派生,也可以将其作为成员。 然后,您需要调用该类的setupUi()
函数来执行创建/布局代码。
从生成的类派生的优点是所有子窗口小部件都是公开可用的。
例如,如果您在QtDesigner中创建一个简单的窗口小部件表单并将其MyWidget
,并且具有一个名为pushbutton_2
QPushButton
,则可以使用以下代码创建该表单:
#include "ui_mywidget.h"
#include <qwidget.h>
#include <qapplication.h>
class Widget : public QWidget, public Ui::MyWidget{
public:
Widget(QWidget *parent = 0):QWidget(parent){
setupUi(this);
}
};
int main(int argc, char **argv){
QApplication app(argc, argv);
Widget w;
w.show();
w.pushbutton_2->setText("test");
return app.exec();
}
您可以直接访问pushbutton_2
的原因是因为它是Ui::MyWidget
的公共成员,您是从该成员派生Widget
。 当您从Widget
的构造函数调用setupUi()
时,也会创建它。
编辑:创建表单的另一种方法是让您生成的类成为显示小部件中的成员类。 但是,您仍然需要调用setupUi()
来创建表单的所有子窗口小部件并执行布局任务。
class Widget : public QWidget{
public:
Widget(QWidget *parent = 0):QWidget(parent){
ui.setupUi(this);
}
private:
Ui::MyWidget ui;
};
在这种情况下,您将无法直接访问子窗口小部件。 原因是,尽管从结构上讲,它们可能是Widget
子代,但ui
属于Widget
的私有成员,而ui
指针变量保存着它们的内存地址,并用于创建它们。
但是,如果您知道它们的对象名称,仍然可以使用findChild<>()
函数访问它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.