QT窗口
从自动生成的窗口头文件里学点什么
不是复习,是新学。还不会爬就让飞了,从头学起肯定来不及。
首先Forms下的mainwindow.ui是默认的,名字可以在新建这个QT Widget Application的时候自定义,比如可以改成mywindow.h。本文使用默认的mainwindow.h
- 开始的几行
#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自己定义的命名空间。
- 后面的类定义
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帮我写代码用的