2

我是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 函数?它有什么作用?

4

5 回答 5

4

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

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

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

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

于 2012-08-29T15:23:44.573 回答
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)的内容会更容易理解。

于 2012-08-29T16:09:57.327 回答
1

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

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

QWidget* pWidget = new QWidget(this);

于 2012-08-29T15:28:40.740 回答
0

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

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

于 2012-08-29T15:27:49.310 回答
0

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

于 2012-08-29T15:38:42.027 回答