繁体   English   中英

C ++ Qt如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM