为什么我们将“this”指针传递给setupUi函数?

时间:2012-08-29 15:14:54

标签: c++ qt

我是QT的新手。以下相当简单的解释来自qt docs:

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
 }
问:我想知道为什么我们将this指针传递给setupUi函数?它会做什么?

5 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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)的内容,则会更容易理解。

答案 2 :(得分:1)

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

不使用Qt Designer或UI文件创建小部件的手动方式如下:

QWidget* pWidget = new QWidget(this);

答案 3 :(得分:0)

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

Martin Beckett的答案可能也是正确的,因为他描述的是Qt中的常见行为(参见小部件派生类构造函数中的'parent'参数)

答案 4 :(得分:0)

请注意,您可以使用其他方式设计器自动生成代码。 在这种情况下,你有一个单独的'UI'类,这个代码不是QObject,因此它也不是QWidget。 自动生成的代码需要有关父窗口小部件的信息,并且需要自动连接插槽和信号,因此这就是您必须通过this的原因。 这个pater比其他pasterns更少侵入(这就是它默认的原因)。您也可以尝试其他模式(查看Qt Creator Designer选项),但我建议您查看设计器工具在默认设置中生成的内容。

相关问题