Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;Qt是如何工作的? 我试图找出如何从我的C++项目中的QT设计器窗体访问组件,没有编译错误,但运行时错误发生。_C++_Qt_Qtgui - Fatal编程技术网

C++;Qt是如何工作的? 我试图找出如何从我的C++项目中的QT设计器窗体访问组件,没有编译错误,但运行时错误发生。

C++;Qt是如何工作的? 我试图找出如何从我的C++项目中的QT设计器窗体访问组件,没有编译错误,但运行时错误发生。,c++,qt,qtgui,C++,Qt,Qtgui,“main”函数和a.exec是如何工作的?我应该在.exec()之前执行代码还是创建一个新线程来执行 QWidget *pWindow; QPushButton *lpPushButton; int main(int argc, char *argv[]) { QApplication a(argc, argv); QtProject w; w.show(); pWindow = QApplication::activeWindow(); lpPushButton

“main”函数和a.exec是如何工作的?我应该在.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();
}
QWidget*pWindow;
QPushButton*LPButton;
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QTW项目;
w、 show();
pWindow=QApplication::activeWindow();
lpbutdown=pWindow->findChild(“按钮2”);;
lp按钮->设置文本(“测试”);
返回a.exec();
}
pWindow和LPINDOW按钮均为空

上面的代码不起作用,因为我不知道从哪里可以调用setText。
关于Qt如何工作的一点ELI5解释将非常好,谢谢。

当您使用QtDesigner创建表单时,它将详细信息存储在一个
xxx.ui
文件中,该文件必须添加到您的项目中。这在预编译步骤中编译成一个
ui\u 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();
}
在这种情况下,您将无法直接访问子窗口小部件。原因是,尽管在结构上,它们可能是
Widget
的子对象,但保存它们的内存地址并用于创建它们的指针变量属于
ui
,它是
Widget
的私有成员


但是,如果您知道它们的对象名,您仍然可以使用
findChild()
函数访问它们。

您会遇到什么运行时错误?访问冲突,但lpputton和pWindow都是空的。我已经多年没有做过任何Qt工作了。你没有为有效的“应用程序启动”注册一个处理程序吗?Qt是事件驱动的,在你进入事件循环后,你需要对事件做出反应来完成你的工作。为什么窗口会有一个按钮?我试过了,但我无法使用
w.pushButton_2
访问任何子元素,但我可以这样做
QPushButton*lpTestBtn=w.parent()->findChild(“TestBtn”);
我添加了第二种使用QtDesigner生成的类的方法。也许这就是您实现它们的方法。
class Widget : public QWidget{
public:
     Widget(QWidget *parent = 0):QWidget(parent){
         ui.setupUi(this);
     }

private:
    Ui::MyWidget ui;
};