为什么我们要"this"指针传递给setupUi 函数?

Why do we pass "this" pointer to setupUi function?

本文关键字:setupUi 函数 指针 我们 this 为什么      更新时间:2023-10-16

我对QT还是个新手。从qt文档中简单解释如下:

class CalculatorForm : public QWidget
 {
     Q_OBJECT
 public:
     CalculatorForm(QWidget *parent = 0);
 private slots:
     void on_inputSpinBox1_valueChanged(int value); //why is that slots are private?
 private:
     Ui::CalculatorForm ui;
 };

以及构造函数的实现

 CalculatorForm::CalculatorForm(QWidget *parent)
     : QWidget(parent) {
     ui.setupUi(this); // <-- Question below
 }

Q: 我想知道为什么我们要将this指针传递给setupUi函数?,它做什么?

这样,对话框将以调用方为父对象,例如,当父对象关闭时,对话框可以自动关闭。一般来说,所有gui元素都有一个指向其父元素的指针。

 private slots:
     void on_inputSpinBox1_valueChanged(int value); //why is that slots are private?

这些是自动生成的插槽,与QtDesigner中gui元素的命名完全匹配。它们只是用来直接连接到那些gui元素,因此应该在这个类中处理。如果这些信号被扩展到其他类,那么gui中的任何更改都需要更改许多其他代码,而这些代码不需要知道gui的详细信息。

在特定gui元素的处理程序槽中,您可以向应用程序的其他部分发出另一个更通用的信号。

setupUi唯一没有创建的小部件是ui文件中层次结构顶部的小部件,由于Ui::CalculatorForm类实例不知道它必须填充的小部件(this),因此必须在某个时刻显式传递给该类。

this或您将传递给它的任何其他小部件都用作所有其他子小部件的父部件。例如,您可以填充一个没有继承的小部件,如下所示:

QWidget *widget = new QWidget;
Ui::CalculatorForm *ui = new Ui::CalculatorForm;
ui->setupUi(widget);
widget->show();

但实际上,如果您阅读uic生成的文件(可能名为ui_calculatorform.h)的内容,会更容易理解。

setupUi创建小部件的实例(QLabel、QTextEdit等)。[用户界面编译器](http://qt-project.org/doc/qt-4.8/uic.html)从.UI表单中为您获取信息,并在生成的moc源文件中生成小部件创建代码。

在不使用Qt设计器或UI文件的情况下手动创建小部件的方式如下:

QWidget* pWidget = new QWidget(this);

我认为应该将调用者小部件添加到这个UI的布局中。这个小部件将是顶级小部件。

Martin Beckett的回答可能也是正确的,因为他所描述的是Qt中的一种常见行为(参见大多数小部件派生类构造函数中的"parent"参数)

请注意,设计器可以通过其他方式自动生成代码。在这种情况下,您有一个单独的"UI"类用于此代码,它不是QObject,因此也不是QWidget。自动生成的代码需要有关父窗口小部件的信息,并对插槽和信号进行自动连接,因此这就是必须传递this的原因
与其他pastern相比,这个pater的侵入性较小(这就是为什么它是默认的)。您也可以尝试其他模式(检查Qt创建者设计器选项),但我建议您查看设计器工具在默认设置中生成的内容。