C++ Qt是如何工作的

C++ How does Qt work?

本文关键字:工作 何工作 Qt C++      更新时间:2023-10-16

我正在尝试弄清楚如何从 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<>() 函数访问它们。