【问题标题】:C++ How does Qt work?C++ Qt 是如何工作的?
【发布时间】:2014-05-22 22:16:09
【问题描述】:

我试图弄清楚如何从我的 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 解释会很棒,谢谢。

【问题讨论】:

  • 您会遇到哪些运行时错误?
  • 访问冲突,但 lpPushButton 和 pWindow 都是 NULL..
  • 我已经好几年没有做任何 Qt 工作了。你不注册一个处理程序来有效地“在应用程序启动时”吗?
  • Qt 是事件驱动的,在你进入事件循环后你需要对事件做出反应来完成你的工作
  • 为什么窗口会有按钮?

标签: c++ qt qtgui


【解决方案1】:

当您使用 QtDesigner 创建表单时,它会将详细信息存储在必须添加到您的项目中的 xxx.ui 文件中。这在预编译步骤中编译成一个ui_xxx.h 文件,您必须将其包含在源文件中。

此头文件包含一个生成的类,其中包含所有小部件和布局代码,并将其放在名为 Ui 的命名空间中。

您有两种选择来使用这个生成的类:您可以从它派生,或者您可以将它作为一个成员。然后你需要调用类的setupUi()函数来执行创建/布局代码。

从生成的类派生的优点是所有子小部件都是公开可用的。

例如,如果您在 QtDesigner 中创建一个简单的小部件表单并将其命名为 MyWidget,并使用一个名为 pushbutton_2QPushButton,您可以使用以下代码创建该表单:

#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 的私有成员.

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

【讨论】:

  • 我试过了,但我无法使用w.pushButton_2 访问任何子元素但我可以做到这一点QPushButton *lpTestBtn = w.parent()-&gt;findChild&lt;QPushButton*&gt;("TestBtn");
  • 我添加了第二种使用 QtDesigner 生成的类的方法。也许这就是您实施它们的方式。
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多