QMainWindow类提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。主窗口通常提供一个大的中央窗口部件,以及周围菜单,工具条,和一个状态栏。QMainWindow窗口经常被继承,使得封装中央部件,菜单,工具条,状态栏等都变得很容易,当用户点击它的时候,相应的槽就会被调用。
//1.创建菜单栏
QMenuBar *bar = menuBar();
//2.将菜单栏设置到窗口中
setMenuBar(bar);
//添加菜单
QMenu *fileMenu = bar->addMenu("文件");
QMenu *editMenu = bar->addMenu("编辑");
//添加菜单项
QAction * newAction=fileMenu->addAction("新建");
//添加分割线
fileMenu->addSeparator();
QAction * openAction=fileMenu->addAction("打开");
//工具栏 可以有多个
QToolBar *toolBar = new QToolBar(this);
//addToolBar(toolBar);
//将工具栏放在左侧
addToolBar(Qt::LeftToolBarArea,toolBar);
//工具栏在不特殊设置时,是可以上下左右停靠的
//只允许上下停靠
toolBar->setAllowedAreas(Qt::TopToolBarArea|Qt::BottomToolBarArea);
//设置工具栏是否可以浮动 就是停留在界面的任意位置
toolBar->setFloatable(false);//设置后,工具栏可以拖拽,但鼠标一离开,就立刻停靠在初始位置(左右,或上下)
toolBar->setMovable(false);//设置后,不能再拖拽工具栏,此时设置的停靠效果也消失
//工具栏中添加小控件
QPushButton *btn = new QPushButton("按钮",this);
toolBar->addWidget(btn);
//工具栏添加菜单项
toolBar->addAction(newAction);
toolBar->addSeparator();
toolBar->addAction(openAction);
//状态栏 只有一个
QStatusBar *status = statusBar();
//将菜单栏放入窗口(这个好像可有可无,我的qt版本是5.9.0,可以试一下,教学视频是有这个的)
//setStatusBar(status);
//放入标签
QLabel *label = new QLabel("左侧信息",this);
//将标签 放入到 状态栏 (从左往右)
status->addWidget(label);
QLabel *label2 = new QLabel("右侧信息",this);
//将标签 放入到 状态栏 (从右往左)
status->addPermanentWidget(label2);
//铆接部件 浮动窗口 可以有多个
QDockWidget *dock = new QDockWidget("铆接组件",this);
//添加铆接组件到窗口,前面的参数是默认停靠区域,后面是我们要添加的组件
addDockWidget(Qt::BottomDockWidgetArea,dock);
//为铆接组件设置停靠范围,和设置工具栏的停靠范围使用的方法是一样的,只是参数发生了变化
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
//核心部件 很多组件都可以设置为核心组件,一旦设置核心组件,其余组件都是围绕其摆放的
//核心组件只有一个
QTextEdit *edit = new QTextEdit(this);
//将组件设置为核心组件
setCentralWidget(edit);



添加具体资源到资源文件

记得在添加完后要保存 快捷键为 Ctrl + S
此时添加成功的标志时res.qrc文件左侧会有个>符号,可以展开

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//在新建的菜单项上显示图片 全局路径的使用文件是本机的,不建议使用
// ui->actionNew->setIcon(QIcon("E:/icon/icon_awty71earc7/index.png"));
//资源文件的使用方式: " : +前缀名 + 文件名"
ui->actionNew->setIcon(QIcon(":/image/page.png"));
ui->actionopen->setIcon(QIcon(":/image/logs.png"));
}
MainWindow::~MainWindow()
{
delete ui;
}
效果图:


//模态对话框 不可以对其他窗口进行操作
QDialog dlg;
//通过exec()去阻塞
dlg.exec();
指定父窗口的QDialog变化

此时会提示对话框过小
setGeometry: Unable to set geometry 100x30+910+505 on QWidgetWindow/‘QDialogClassWindow’. Resulting geometry: 120x30+910+505 (frame: 8, 31, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
setGeometry: Unable to set geometry 100x30+910+505 on QWidgetWindow/‘QDialogClassWindow’. Resulting geometry: 120x30+910+505 (frame: 8, 31, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
我们需要将对话框的大小进行设置
//非模态对话框,可以对其他窗口进行操作 由于没有exec()进行阻塞,这个对话框需要创建在堆区才不会一闪而过
QDialog *dlg2=new QDialog(this);
dlg2->resize(150,80);
dlg2->show();

从上图不难看出其他界面再启用非模态对话框时,还是可以进行操作的
由于我们的对话框是挂在父窗口上,父窗口不关闭,就不会释放掉对话框所占的空间,可能会造成内存奔溃,此时我们需要添加
dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号属性
让对话框可以在关闭对话框时,释放掉对话框所占的内存空间
所谓标准对话框,是Qt内置的一系列对话框,用于简化开发。
事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,所以没必要所有程序都自己实现对话框。
错误提示对话框
QMessageBox::critical(this,"错误","critcal");

信息对话框
QMessageBox::information(this,"信息","information");

提问对话框
//提问对话框
//参数1 父窗口 参数2 窗口标题 参数3 提示信息 参数4 按键类型(默认按键类型是yes|no,可以进行修改)
QMessageBox::question(this,"提问","question?");

//参数1 父窗口 参数2 窗口标题 参数3 提示信息
//参数4 按键类型(默认按键类型是yes|no,可以进行修改) 参数5 关联回车按键(默认选中)
QMessageBox::question(this,"提问","question?",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);

怎么控制提问对话框的按钮?
if(QMessageBox::Save==
QMessageBox::question(this,"提问","question?",
QMessageBox::Save|QMessageBox::Cancel,
QMessageBox::Cancel))
{
qDebug()<<"点击的是Save";
}else{
qDebug()<<"点击的是Cancel";
}
警告对话框
QMessageBox::warning(this,"警告","warning!!!");

//打开文件 参数1 父窗口 参数2 标题 参数3 目标路径 参数4 过滤文件
QFileDialog::getOpenFileName(this,"打开文件",
"C:\\Users\\Administrator\\Documents\\WeChat Files\\wxid_nqdxbnclvfzd22\\FileStorage\\File\\2022-10"
,"(*.txt)");

可以用一个QString来接收打开的文件名,此时拿到的文件名是绝对路径
//颜色对话框
QColor color=QColorDialog::getColor(QColor(255,0,0));
qDebug()<<color.red()<<color.green()<<color.blue();

//字体对话框
bool ok;
//参数 一个bool值,QFont("字体",字号)
QFont font =QFontDialog::getFont(&ok,QFont("华文彩云",36));//通过返回值,可以拿到选中的字体是什么,多大
qDebug()<<"字体"<<font.family()
<<"字号"<<font.pointSize()
<<"是否倾斜"<<font.italic()
<<"是否是粗体"<<font.bold();
由于我的电脑没有华文彩云这种字号,所以默认选字体的第一种

QT本身是有很多布局的

大致就是水平,竖直,网格,形状布局
水平就是方向上是水平的,竖直与之相反
网格和形状布局差不多
如果我们要做登录界面,直接使用布局会有很多红框影响布局效果
此时我们可以用一个更小的容器去包裹一些布局,Widget作为容器是非常好的选择
其可以支持水平,竖直和栅格布局
我们可以将用户名和密码以及他们的输入框放入同一个Widget中,使用栅格布局,使其摆放有规律,
此时页面不是很完美,Widget容器过大,且用户名和密码之间的间距过小
关于Widget容器过大,可以把它的水平策略更改为fixed,使其在水平方向上包裹容器中的容件,位置是

如果各个空间之间的间距过小,可以通过添加组件Spacers(弹簧)去改变,弹簧分水平和竖直方向

此时的布局界面是可以随意改变的,如果我们不想界面被改变,可以设置其固定的最大和最小大小,使其保持一致

现在看一下具体效果

根据正常逻辑,我们的密码是不应该明文显示的,此时只要改变echoMode属性
echoMode属性简介:
具体逻辑还没写
QListWidgetItem *item1 = new QListWidgetItem("下午吃什么?");
ui->listWidget->addItem(item1);
//设置QListWidgetItem的显示 水平居中
item1->setTextAlignment(Qt::AlignHCenter);
//QStringList ====== QList List
QStringList list;
list<<"明天你好"<<"声音多渺小"<<"却提醒我"<<"勇敢是什么";
ui->listWidget->addItems(list);
代码中的listWidget是一个QListWidget对象
代码运行图示:

#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
//TreeWidget每个项目都称为QTreeWidgetItem
//添加根节点
QTreeWidgetItem *item1 = new QTreeWidgetItem(QStringList()<<"辅助");
QTreeWidgetItem *item2 = new QTreeWidgetItem(QStringList()<<"打野");
QTreeWidgetItem *item3 = new QTreeWidgetItem(QStringList()<<"中单");
ui->treeWidget->addTopLevelItem(item1);
ui->treeWidget->addTopLevelItem(item2);
ui->treeWidget->addTopLevelItem(item3);
//添加子节点
QStringList l11;
QStringList l12;
QStringList l13;
l11<<"派克"<<"刺客,会打钱";
l12<<"乌鸦"<<"法坦,巨能吸";
l13<<"泰坦"<<"坦克,直接一抗五";
QTreeWidgetItem *l1 = new QTreeWidgetItem(l11);
QTreeWidgetItem *l2 = new QTreeWidgetItem(l12);
QTreeWidgetItem *l3 = new QTreeWidgetItem(l13);
item1->addChild(l1);
item1->addChild(l2);
item1->addChild(l3);
}
Widget::~Widget()
{
delete ui;
}

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//tabelWidget
//设置列
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置具体内容
QList<QString> nameList;
nameList<<"张三"<<"李四"<<"王五"<<"赵六"<<"钱七";
QStringList sexList;
sexList<<"男"<<"女"<<"男"<<"女"<<"男";
for(int i=0;i<5;i++){
int col = 0;
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18+i)));
}
}
Widget::~Widget()
{
delete ui;
}
