为什么MainWindow的成员功能可以在QT中调用Qlabel的成员



我在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-> label-> setText("单击botton是"(。我的理解UI是MainWindow的私人成员,它是从Qwidget继承的。但是只标记Qlabel的成员。为什么基类成员可以称呼派生类的成员?还是有人可以向我解释为什么这是对的?

非常感谢你们

您的类" mainwindow"是从qmainwindow派生的。UI是全球层面的名称空间;它包含一个名为Mainwindow的类,这不是您的" MainWindow"。UI是您类型UI类的私人成员:: MainWindow,它包含Qlabel。

您使两件事感到困惑:类的对象和类的成员。类的对象是类的实例。例如,您声明一些整数变量int n。在这里,int是一类,n是类int的对象(或实例(。成员是您在 private 下,您在类中声明的任何内容,受保护的 and public public 关键字。

您的MainWindow具有一个名为ui的成员(在您的mainwindow.h文件中的类MainWindow中声明(。同时, ui Ui::MainWindow class的对象(如果打开ui_mainwindow.h文件并查看Ui_MainWindow类,您应该了解其工作原理(。

所以在您的功能(插槽(中:

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

您正在调用MainWindow ui的私人成员(这是另一类的对象(。ui具有Qlabel类的对象(或实例(的公共成员label

对不起,我的英语。希望这是有道理的。

最新更新