? QWidget
- QWidget是所有QT控件的基类,包括按钮,窗口,对话框等,全部继承自QWidget
- QWidget类包含一个parent指针,这个指针也是QWidget类型,表示QWidget的上级界面对象。当parent为空时,QWidget即是顶级窗口,会显示窗口标题,按钮和边框。当parent非空时,QWidget则会成为parent中的控件,或是对话框,子窗口。
- 当parent窗口被关闭时,子窗口也会跟随关闭
? QMainWindow
- QMainWindow继承自QWidget,它设计出来是专门用作主窗口使用的,而QWidget技能做窗口,又能做控件
- QMainWindow默认已经封装了一个的常用的窗口布局,可以快捷地添加菜单栏,工具栏,状态栏,悬停面板等窗口组件,并且为他们已经设置好了默认的布局位置
? UI指针:连接QMainWindow与UI文件 QtCreator在创建UI界面文件时,可以自动帮我们生成一个Window类,Window类会自动加载UI文件中的控件和布局,现在我们来说明,Window类是如何自动创建界面的
- QtCreator会根据UI文件自动生成一个界面管理工具类,比如名为homewindow.ui的界面文件,编译时会生成名为Ui::HomeWindow的界面管理工具类
- Ui::HomeWindow类中,有一个setupUi(*QMainWindow)方法,会自动将UI文件中的界面和布局添加到QMainWindow对象中,并保留了所有控件和布局的指针,以便快速访问
- QtCreator会帮我们生成一个名为HomeWindow的窗口类,它继承自QMainWindow
- 注意HomeWindow同Ui::HomeWindow的区别,他们虽然同名,但是命名空间不同,并不是同一个类,HomeWindow是一个窗口类,而Ui::HomeWindow是一个工具类,它并不是窗口
- HomeWindow类中包含一个ui指针,它指向一个Ui::HomeWindow对象,通过调用ui->setupUi(this),即可将UI文件中的界面和布局自动加载到自己身上
? 加载UI文件 我们还可以手动加载一个UI文件,来得到一个QWidget对象 这种技术适用于窗口内容不确定,需要动态从文件加载界面的情况 当我们想在不同界面中复用同一个子界面时,也可以使用这种技术
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
//通过UI文件加载一个QWidget控件
QUiLoader loader;
QFile file("E:/ws-qt/02/customwidget.ui");
file.open(QFile::ReadOnly);
QWidget *customWidget = loader.load(&file);
file.close();
//显示
customWidget->setGeometry(0, 0, 800, 600);
customWidget->show();
//获取子控件
QPushButton *pushButton = customWidget->findChild("pushButton");
pushButton->setGeometry(0, 0, 200, 100);
pushButton->setText("Load UI File");
return a.exec();
}
? 创建窗口 通过以上讲解我们知道,通过QWidget,QWindow,UI文件都可以创建窗口 每种方式都有自己的优缺点,在实际应用中,我们应当根据不同方式的特点来灵活运用
? 示例代码
#include
#include
#include "mainwindow.h"
#include "ui_homewindow.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
// QWidget是所有窗口和控件的基类
// 如果QWidget没有指定parent,则为顶级控件,会显示窗口和标题
QWidget *w1 = new QWidget();
w1->setWindowTitle("Top Widget");
w1->show();
// 如果QWidget指定了parent,则会显示在parent控件内,并隐藏窗口和标题
QPushButton *w2 = new QPushButton(w1);
w2->setGeometry(0, 0, 400, 300);
w2->setStyleSheet("background:red;");
w2->setWindowTitle("Child Widget");
w2->show();
// QMainWindow是一个专门的窗口类,它集成自QWidget
// QMainWindow默认已经设置好了窗口布局,并封装了添加菜单栏,工具栏,状态栏,悬停面板的快捷方法
// 通过setMenuBar,addToolBar等方法,即可快捷地将控件添加到对应位置
QMainWindow *w3 = new QMainWindow();
QStatusBar *statusBar = new QStatusBar();
statusBar->setGeometry(0, 0, 1000, 50);
statusBar->setStyleSheet("background:yellow;");
w3->setStatusBar(statusBar);
w3->setWindowTitle("MainWindow");
w3->show();
// QtCreator会自动根据ui文件,帮我们生成一个界面工具类
// 这个工具类可以将ui文件中的界面和布局,通过setupUi方法自动添加到QMainWindow中
// 比如homewindow.ui文件,编译后会生成一个Ui::HomeWindow工具类
// 我们通过QtCreator创建ui文件时,QtCreator可以自动帮我们生成一个窗口类,并自动设置好界面
// 其原理,实质就是创建了QMainWindowd的继承类,并通过ui工具类来自动填充界面
QMainWindow *w4 = new QMainWindow();
Ui::HomeWindow *ui = new Ui::HomeWindow();
ui->setupUi(w4);
w4->setWindowTitle("MainWindow with UI");
w4->show();
return a.exec();
}