为什么Mainwindow的成员函数可以在Qt中调用Qlabel的成员

时间:2018-02-05 23:05:08

标签: c++ qt

我是C ++的新手,刚开始用C ++学习Qt。我发现下面的代码让我感到困惑。它只是在窗口中创建一个标签。

mainwindow.cpp是

    1   #include "mainwindow.h"
    2   #include "ui_mainwindow.h"
    3   
    4   MainWindow::MainWindow(QWidget *parent) :
    5       QMainWindow(parent),
    6       ui(new Ui::MainWindow)
    7   {
    8       ui->setupUi(this);
    9   }
   10   
   11   MainWindow::~MainWindow()
   12   {
   13       delete ui;
   14   }
   15   
   16   void MainWindow::on_pushButton_clicked()
   17   {
   18       ui->label->setText("button is clicked");  
   19        
   21   }

Main.cpp是

    1   #include "mainwindow.h"
    2   #include <QApplication>
    3   
    4   int main(int argc, char *argv[])
    5   {
    6       QApplication a(argc, argv);
    7       MainWindow w;
    8       w.show();
    9   
   10       return a.exec();
   11   }

Mainwindow.h是

 1  #ifndef MAINWINDOW_H
    2   #define MAINWINDOW_H
    3   
    4   #include <QMainWindow>
    5   
    6   namespace Ui {
    7   class MainWindow;
    8   }
    9   
   10   class MainWindow : public QMainWindow
   11   {
   12       Q_OBJECT
   13   
   14   public:
   15       explicit MainWindow(QWidget *parent = 0);
   16       ~MainWindow();
   17   
   18   private slots:
   19       void on_pushButton_clicked();
   20   
   21   private:
   22       Ui::MainWindow *ui;
   23   };
   24   
   25   #endif // MAINWINDOW_H

我的困惑是ui - &gt; label-&gt; setText(“botton is clicked”)。 我理解ui是MainWindow的私有成员,它继承自Qwidget。但标签只是Qlabel的成员。为什么基类成员可以调用派生类的成员?或者有人可以解释一下为什么这是对的?

非常感谢你们

2 个答案:

答案 0 :(得分:0)

您的班级“MainWindow”源自QMainWindow。 Ui是全球一级的命名空间;它包含一个名为MainWindow的类,这不是你的“MainWindow”。 ui是你的类Ui :: MainWindow的私有成员,它包含QLabel。

答案 1 :(得分:0)

你混淆了两件事:一个类的对象和一个类的成员。类的对象是类的实例。例如,您声明一些整数变量int n。这里,int是一个类,n是类int的对象(或实例)。 会员是您在班级中声明的私有受保护公开关键字。

您的MainWindow班级有一名成员,名为ui(在MainWindow文件中的班级mainwindow.h内宣布)。 ui同时是 <{strong> Ui::MainWindow类的对象(如果您打开ui_mainwindow.h文件并查看Ui_MainWindow类,那么应该了解它是如何工作的。)

所以在你的函数(插槽)中:

void MainWindow::on_pushButton_clicked()
{
    ui->label->setText("button is clicked");  
}

您正在调用MainWindow ui的私有成员(这是另一个类的对象)。 ui有一个公共成员label,它是QLabel类的对象(或实例)。

抱歉我的英文。希望它有道理。