看看QT窗口头文件

QT窗口

从自动生成的窗口头文件里学点什么
看看QT窗口头文件
不是复习,是新学。还不会爬就让飞了,从头学起肯定来不及。

首先Forms下的mainwindow.ui是默认的,名字可以在新建这个QT Widget Application的时候自定义,比如可以改成mywindow.h。本文使用默认的mainwindow.h

  1. 开始的几行
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

前两行不用说。第三行中的QMainWindow是一个类

Qt中的顶层窗口称为MainWindow,属于类QMainWindow. QMainWindow是继承于QWidget。
通过子类化QMainWindow可以创建一个应用程序的窗口。

接着QT_BEGIN_NAMESPACE和QT_END_NAMESPACE的定义如下:(来自qglobal.h)

# define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
# define QT_END_NAMESPACE }

所以这三行相当于

namespace QT_NAMESPACE {
namespace Ui { class MainWindow; }
}

其中QT_NAMESPACE是Qt自己定义的命名空间。

  1. 后面的类定义
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};

只有private slots那里是因为我写了槽函数才有的,其他都是自动生成。
可以看到我的MainWindow类继承了自带的QMainWindow类

class MainWindow : public QMainWindow

下面结合.cpp中生成的代码看看这些都是什么——

· 我乱写的两个槽函数是private slots

// 头文件
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    
//cpp文件
void MainWindow::on_pushButton_clicked()
{
    ui->textBrowser->setText(QString::number(ui->lineEdit->text().toDouble()+ui->lineEdit_2->text().toDouble()));
}
void MainWindow::on_pushButton_2_clicked()
{
    ui->pushButton_2->setText("helloWorld");
}
真的是乱写的乱写的

· ui是我定义的MainWindow类的指针。在cpp中构造时new出空间,析构时delete掉

//头文件
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
    
//cpp文件
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}

含有对象的派生类构造函数:
派生类构造函数名(总形参表列): 基类构造函数名(实参表列), 子对象名(实参表列)
{
派生类中新增数成员据成员初始化语句
}
MainWindow(QWidget *parent): QMainWindow(parent), ui(new UI::MainWindow)
{

}
同时注意到cpp文件开头:

#include "mainwindow.h"
#include "ui_mainwindow.h"

引用了基类自己的头文件mainwindow.h以及ui_mainwindow.h
后者在项目视图下是看不到的,ctrl放在上面可以点进去,发现是一份自动生成的详细记录。如下


```css
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QPushButton *pushButton;
    QTextBrowser *textBrowser;
    QLineEdit *lineEdit;
    QLineEdit *lineEdit_2;
    QPushButton *pushButton_2;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(800, 600);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        pushButton = new QPushButton(centralwidget);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(210, 130, 101, 41));
        textBrowser = new QTextBrowser(centralwidget);
        textBrowser->setObjectName(QString::fromUtf8("textBrowser"));
        textBrowser->setGeometry(QRect(330, 60, 171, 111));
        lineEdit = new QLineEdit(centralwidget);
        lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
        lineEdit->setGeometry(QRect(40, 60, 151, 51));
        lineEdit_2 = new QLineEdit(centralwidget);
        lineEdit_2->setObjectName(QString::fromUtf8("lineEdit_2"));
        lineEdit_2->setGeometry(QRect(40, 120, 151, 51));
        pushButton_2 = new QPushButton(centralwidget);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
        pushButton_2->setGeometry(QRect(210, 190, 151, 81));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 800, 21));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        MainWindow->setStatusBar(statusbar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
        pushButton->setText(QCoreApplication::translate("MainWindow", "\346\261\202\345\222\214", nullptr));
        pushButton_2->setText(QCoreApplication::translate("MainWindow", "PushButton", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

所以说我在ui界面随意拖拽改变大小、改变文本,其实都是在写代码,用了setObjectName, setGeometry等等,只不过不是自己写的
这个ui_mainwindow.h开头长这个样子:

/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

怪不得不显示,因为本来就不应该在这里人工敲进代码,这里就是QT帮我写代码用的

上一篇:打造一个window桌面应用:在线聊天对话机器人


下一篇:pyqt5的mdimainwindow