我刚刚开始使用Qt教程,而且我也是C ++的初学者。在Qt教程中,有一个使用语句设置按钮文本的示例:
ui->pushButton->setText("Hello");
我知道我们可以使用->
运算符来允许指针访问类的成员。在这种情况下,pushButton->setText("Hello")
,但我只是不理解ui->pushButton
的含义,我搜索了一些答案,解释说ui
持有pushButton
的引用,但是如何做到这一点? pushButton
是指向对象的指针,不是类的成员,我们可以使用->
将对象地址放到ui
指针中吗?
抱歉我的英语不好,我可能会困惑你。我希望有人能提前给我一个明确的解释。
答案 0 :(得分:8)
ui
指针是使用QT Creator的表单编辑器创建的xml生成的。
您可以在输出目录中找到自动生成的头文件。例如,主窗口有ui_mainwindow.h
。运行qmake
后会创建此文件。如果您使用QT Creator,则会自动完成。
以下是自动生成的ui
:
class Ui_MainWindow
{
public:
QWidget *centralWidget;
QPushButton *pushButton;
QMenuBar *menuBar;
QToolBar *mainToolBar;
QStatusBar *statusBar;
...
};
ui
是Ui_MainWindow *
,因此您可以使用->
来访问Ui_MainWindow
类的成员,例如pushButton
。
pushButton
是QPushButton *
,因此您可以使用->
来访问QPushButton
类的成员,例如setText()
。
ui->pushButton->setText("Hello")
等同于:
Ui_MainWindow * ui = new Ui_MainWindow;
...
QPushButton * btn = ui->pushButton;
btn->setText("Hello");
一些更正:
->
不允许指针执行操作:)
->
只是一个访问类或 struct 成员的运算符,必须应用于指针。如果您有实例,则必须使用.
运算符来访问成员。
请参阅:operators。
最后你应该阅读similar question。
答案 1 :(得分:3)
"箭头" operator ->
用于取消引用指向对象的指针以获取其成员。因此,如果您在变量ui
中有一个指针,并且该对象具有成员pushButton
,那么您可以使用ui->pushButton
来访问pushButton
成员。如果pushButton
成员依次是指向对象的指针,那么您再次使用->
来访问其成员,例如ui->pushButton->setText("Hello")
。
使用"箭头" operator基本上只是解除引用(一元*
)和点(.
)成员访问运算符的语法糖。
所以声明
ui->pushButton->setText("Hello");
也可以写成
(*(*ui).pushButton).setText("Hello");