C++ Qt是如何工作的
C++ How does Qt work?
我正在尝试弄清楚如何从 C++ 项目中的 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。关于Qt如何工作的一点ELI5解释会很棒,谢谢。
当您使用 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
的原因是因为它是您从中派生Widget
Ui::MyWidget
的公共成员。当您从 Widget
的构造函数调用 setupUi()
时,也会创建它。
编辑:创建表单的另一种方法是将生成的类作为显示小部件中的成员类。不过,您仍然需要调用setupUi()
,以便创建所有表单的子小部件并执行布局任务。
class Widget : public QWidget{
public:
Widget(QWidget *parent = 0):QWidget(parent){
ui.setupUi(this);
}
private:
Ui::MyWidget ui;
};
在这种情况下,您将无法直接访问子小组件。原因是,尽管在结构上,它们可能是Widget
的子项,但保存内存地址并用于创建它们的指针变量属于ui
,它是Widget
的私有成员。
但是,如果您知道它们的对象名称,则仍然可以使用 findChild<>()
函数访问它们。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个