1. QMainWindow
-
QMainWindow 用来创建主窗口
-
主窗口包含: 标题栏(Window title)、菜单栏(MenuBar)、工具栏(ToolBar)、状态栏(StatusBar)、停靠部件(DockWidgetArea)、工作空间(Central Widget)
1.1 菜单栏
-
菜单栏需要使用的包: QMenuBar 、 QMenu
-
QMenuBar: 用来创建菜单栏
-
addMenu:将菜单项添加到菜单栏
-
-
QMenu: 用来创建菜单
-
addAction: 添加动作,向菜单中添加菜单项(选择菜单项才执行具体的操作
-
addSeparator: 添加分割线
-
-
其他用到的方法:
-
this->setMenuBar(xxx):该方法是 QMainWindow 提供的方法,用来将菜单栏添加到窗口
-
包含一、二、三级菜单示的例:
#include "mymainwindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QDebug>
#include<QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTextEdit>
#include <QDockWidget>
MyMainWindow::MyMainWindow(QWidget *parent)
: QMainWindow(parent)
{
this ->setWhatsThis("主窗口测试");
this->resize(500,300);
1.菜单栏/
//1.实例化菜单栏对象并设置到窗口上
QMenuBar *menubar = new QMenuBar;
this->setMenuBar(menubar);
//2) 创建一级菜单
QMenu *fileMenu = menubar->addMenu("文件");
//menubar->addMenu("文件");
QMenu *editMenu = menubar->addMenu("编辑");
QMenu* debugMenu = menubar->addMenu("调式");
QMenu* toolMenu = menubar->addMenu("工具");
//3)创建二级菜单
//没有子菜单的菜单项都能点击操作,统统都叫做Action
//有子菜单的菜单项,鼠标放在菜单项上时,就会自动展开子菜单,都叫做Menu
//向文件菜单中添加子菜单
QAction *newAction = fileMenu->addAction(QIcon(":/icons/amumu.png"),"新建");
// QAction *newAction = fileMenu->addAction("新建");
QAction *openAction = fileMenu->addAction(QIcon(":/icons/ashe.png"),"打开");
fileMenu->addSeparator();
QAction *exitAction = fileMenu->addAction(QIcon(":/icons/jax.png"),"退出");
toolMenu->addAction("locket");
QMenu *outMenu = toolMenu->addMenu("外部");
QMenu *quickMenu = outMenu->addMenu("Qt Quick");
quickMenu->addAction("aaa");
quickMenu->addAction("bbb");
QMenu *yuyanMenu = outMenu->addMenu("Qt预言家");
yuyanMenu->addAction("ccc");
QMenu *wenbenMenu = outMenu->addMenu("文本");
wenbenMenu->addAction("ddd");
outMenu->addSeparator();
QMenu *configMenu = outMenu->addMenu("config");
configMenu->addAction("123");
toolMenu->addSeparator();
toolMenu->addAction("选项");
editMenu->addAction("Undo");
editMenu->addAction("Redo");
editMenu->addSeparator();
editMenu->addAction("全选");
//链接action的信号和槽
connect(newAction, &QAction::triggered,[](){
qDebug() << "准备新建文件";
});
connect(openAction,&QAction::triggered,[](){
qDebug() << "打开文件";
});
connect(exitAction,&QAction::triggered, this, &QMainWindow::close);
//创建三级菜单
debugMenu->addAction("脱离调试");
//创建带有子菜单的菜单项
QMenu *startMenu= debugMenu->addMenu(QIcon(":/icons/vn.png"),"开始调试");
startMenu->addAction("start debug");
startMenu->addAction("忽略");
startMenu->addSeparator();
startMenu->addAction("关联");
}
MyMainWindow::~MyMainWindow()
{
}
三级菜单结构图:
-
创建菜单栏,并将菜单栏添加到窗口上
QMenuBar *menuBar = new QMenuBar;
this->setMenuBar(menuBar);
-
创建一个可以点击的菜单项时,调用 addAction
-
创建一个可以包含子菜单的菜单项时,调用 addMenu 方法
QMenu *level_1 = menuBar->addMenu("一级菜单");
level_1->addAction("可以点击的二级菜单");
QMenu *level_2 = level_1->addMenu("可以包含三级菜单的菜单");
level_2->addAction(..) ; level_2->addMenu(....)
1.2 为action增加信号
-
QAction 类可以保存 addAction 得到的对象
-
QAction 提供了 triggered 信号,点击时会触发
#include <QMenuBar>
#include <QMenu>
#include <QAction>
// 创建菜单栏
QMenuBar *bar = new QMenuBar;
this->setMenuBar(bar);
// 配置一级菜单
QMenu *fileMenu = bar->addMenu("文件");
fileMenu->addAction("新建");
fileMenu->addSeparator();
// 使用 QAction 类保存 addAction 得到的对象
QAction *exitAction = fileMenu->addAction("退出");
// 配置 信号 和 槽 ---> 退出功能
connect(exitAction, &QAction::triggered, this, &QWidget::close);
1.3 QIcon
QIcon 用来创建图标,图标就是图片
在项目中使用 QIcon 首先要将 QIcon 加入到项目中
1.3.1 向项目中增加资源
1.将图片保存到项目目录下
2. 以资源形式将图片添加到项目中
3.添加前缀 和 资源图片
1.3.2 在菜单中设置图标
-
QIcon("图标地址")
-
地址格式:绝对路径 或者 资源路径
-
资源路径以 : 开头
-
-
addMenu(QIcon, title);
-
addAction(QIcon, title);
-
注意事项:如果给一级菜单设置图标,则不显示文字只显示图标
// 带图标菜单
// 一级菜单只显示图片,不显示文字
QMenu *help = bar->addMenu(QIcon(":/icon/sound0.png"), "帮助");
help->addAction(QIcon(":/icon/sound1"), "关于我们");
QMenu *help_l1 = help->addMenu(QIcon("E:/c++/QT/qt-3/exp/01_main_1/icon/search.png"), "联系我们");
help_l1->addAction(QIcon(":/icon/save.png"), "QQ");
help_l1->addAction(QIcon(":/icon/saveAs.png"), "微信");
1.4 工具栏
-
QToolBar: 工具栏类
-
this->addToolBar(xxx): 该方法是 QMainWindow 提供的方法,用来将工具栏添加到窗口中
-
-
核心方法: addAction
-
由于工具栏中的操作项基本都和菜单栏中的操作项一样(快捷方式),所以可以调用 addAction 方法将菜单栏中的对应项直接方进去
-
-
QToolBar 其他常用方法:
-
setAllowedAreas(位置):配置工具栏显示的位置,默认显示在上方,并且能够在上下左右移动
-
Qt::LeftToolBarArea : 显示在窗口左侧
-
Qt::RightToolBarArea : 显示在窗口左侧
-
Qt::TopToolBarArea : 显示在窗口左侧
-
Qt::BottomToolBarArea : 显示在窗口左侧
-
-
setFloatable(true/false): 设置工具栏是否能浮动
-
setMovable(true/false): 设置工具栏是否允许在上下左右移动
-
addSeparator(): 设置分割线
-
-
按钮也能设置到工具栏中
-
toolBar->addWidget(xxx);
-
// 工具栏
// 创建工具栏
QToolBar *toolBar = new QToolBar;
// 将工具栏添加到主窗口
this->addToolBar(toolBar);
// 配置工具栏能够显示的位置, 默认上下左右, 此处设置为 左右
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
// 禁止工具栏浮动
toolBar->setFloatable(false);
// 禁止工具栏移动
toolBar->setMovable(false);
toolBar->addAction("新建");
toolBar->addSeparator();
toolBar->addAction(open);
// 在工具栏中添加按钮
QPushButton *print = new QPushButton;
print->setText("打印");
toolBar->addWidget(print);
1.5 状态栏
-
QStatusBar:状态栏类
-
this->setStatusBar(xxx):该方法是 QMainWindow 提供的方法,用来将状态栏添加到窗口下方
-
addWidget(widget):将状态信息添加到左侧
-
addPermanentWidget(widget): 将状态信息添加到右侧
-
QStatusBar * stBar = new QStatusBar;
this->setStatusBar(stBar);
QLabel *baseInfo = new QLabel("基础信息", this);
stBar->addWidget(baseInfo);
QLabel *countInfo = new QLabel("统计信息", this);
stBar->addPermanentWidget(countInfo);
1.6 中心部件
-
setCentralWidget(): 该方法是 QMainWindow 提供的方法,用来将中心部件添加到窗口
// 配置中心部件
QTextEdit *txt = new QTextEdit(this);
this->setCentralWidget(txt);
1.7 铆接部件
-
QDockWidget: 铆接部件类
-
this->addDockWidget: QWidget 提供的方法,将铆接部件添加到窗口
-
setAllowedAreas: 设置铆接部件能够停靠的位置
-
// 配置铆接部件
QDockWidget * dw = new QDockWidget("标题", this);
this->addDockWidget(Qt::LeftDockWidgetArea, dw);
dw->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
2. ui 方式操作 MainWindow
2.1 创建项目
创建项目时勾选 "创建界面"
增加了 .ui 文件,内部是 xml 文档形式描述UI结构选择 "设计" 时,显示UI结构,可以使用 拖拽方式来设计UI.pro 文件增加了 .ui 文件的配置
2.2 菜单栏
1.创建菜单栏
注意事项:
-
添加菜单时,建议先写英文,再改为中文。 使用英文方便创建对应的对象
-
文件 ---> menufile
-
编辑 ---> menuedit
-
查看 ---> menuview
-
help ---> 帮助
-
2.增加二级菜单
将二级菜单修改为中文显示
3.增加三级菜单
2.3 工具栏
-
在一个窗口中可以有多个工具栏
-
可以将 actionXxx 直接拖拽到工具栏
2.4 状态栏&铆接
状态栏和铆接部件只能手写
2.5 中心部件
将部件拖拽到中心区域即可
3. 其他对话框
3.1 QMessageBox
QMessageBox 是一种消息对话框,能够对用户的操作进行提示。
静态方法:
-
基础提示: QMessageBox::about(参数1, 参数2, 参数3)
-
信息提示:QMessageBox::information(参数1, 参数2, 参数3, 参数4, 参数5)
-
警告提示:QMessageBox::warning(参数1, 参数2, 参数3, 参数4, 参数5)
-
错误提示:QMessageBox::critical(参数1, 参数2, 参数3, 参数4, 参数5)
-
询问提示:QMessageBox::question(参数1, 参数2, 参数3, 参数4, 参数5)
-
参数1: 父控件
-
参数2: 标题栏提示信息
-
参数3: 主提示信息
-
参数4: 按钮设置 (注意:每一种messagebox都有默认的按钮;如果默认的按钮不够用或者不合适可以进行修改)
-
参数5: 默认选中按钮
-
// 关于
connect(ui->aboutBtn, &QPushButton::clicked, [=](){
QMessageBox::about(this, "关于", "关于提示信息");
});
// 消息提示框
connect(ui->infoBtn, &QPushButton::clicked, [=](){
QMessageBox::information(this, "提示", "这是一个提示信息");
});
// 警告提示框
connect(ui->warnBtn, &QPushButton::clicked, [=](){
QMessageBox::warning(this, "警告", "这是一个严重警告框");
});
// 错误提示框
connect(ui->errBtn, &QPushButton::clicked, [=](){
QMessageBox::critical(this, "错误", "这是一个严重错误");
});
// 问题询问框
connect(ui->questionBtn, &QPushButton::clicked, [=](){
QMessageBox::question(this, "询问", "你选yes 还是 no", QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel);
});
3.2 中文按钮
使用构造函数创建按钮
// 使用 QMessageBox 构造函数创建提示框
QMessageBox myBox(
QMessageBox::Question,
"努力脱单",
"你愿意嫁给我吗!",
QMessageBox::Yes| QMessageBox::No
);
// 设置按钮文字
myBox.setButtonText(QMessageBox::Yes, "愿意"); //方式1
myBox.button(QMessageBox::No)->setText("滚蛋"); //方式2
int Ret = myBox.exec(); // 获取点击的按钮
if(Ret == QMessageBox::Yes) //通过判断返回值确定用户点击了愿意还是滚蛋。
{
qDebug() << "太好了!";
}
else if(Ret == QMessageBox::No)
{
qDebug() << "滚犊子";
}
3.3 文件选择框
QFileDialog 类能弹出一个文件选择框
静态方法:
-
getOpenFileName(参数1, 参数2, 参数3, 参数4) : 打开文件
-
getSaveFileName(参数1,参数2,参数3,参数4) : 保存文件
-
参数1: 父组件
-
参数2:标题栏文本
-
参数3:打开的文件夹
-
参数4:过滤的文件类型, 如果过滤多种文件类型,需要使用 ;; 进行分割
-
返回值: 选择的文件的绝对路径,如果选择 "取消" 按钮则返回空
-
-
getExistingDirectory(参数1, 参数2, 参数3) : 打开路径
-
参数1: 父组件
-
参数2:标题栏文本
-
参数3:默认打开的文件夹
-
-
返回值: 选中的目录的绝对路径
打开文件
// 文件对话框
connect(ui->fileBtn, &QPushButton::clicked, [=](){
QString filePath = QFileDialog::getOpenFileName(
this,
"选择文件",
"C:/Users/Administrator/Documents",
"*.txt;;*.jpg;;*.png"
);
qDebug() << filePath;
});
保存文件
connect(ui->saveBtn, &QPushButton::clicked, [=](){
QString filePath = QFileDialog::getSaveFileName(this, "保存", "./", "*.txt");
qDebug() << filePath;
});
打开目录
connect(ui->dirBtn, &QPushButton::clicked, [=](){
QString dirPath = QFileDialog::getExistingDirectory(this, "打开目录", "e:/c++/QT");
qDebug() << dirPath;
});
3.4 颜色选择器
-
QColorDialog 类能够弹出一个颜色选择框
-
静态方法:
-
getColor(QColor)
-
-
QColor(red, green, blue, alpha) 类用来设置颜色
-
red() \ green() \ blue() : 获取红色、绿色、蓝色 的色值
-
// 颜色选择器
connect(ui->colorBtn, &QPushButton::clicked, [=](){
// 方式一: 打开颜色选择器
// getColor() : 空参时 默认选中白色
QColor color = QColorDialog::getColor();
// 设置:初始值
// QColor(red, green, blue);
QColor color = QColorDialog::getColor(QColor(123, 255, 89));
qDebug() << color.red() << color.green() << color.blue() << color.alpha();
});
connect(ui->colorBtn, &QPushButton::clicked, [=](){
// 方式二:
QColorDialog colorDia(Qt::cyan); // 打开颜色选择器,指定默认颜色
colorDia.setOption(QColorDialog::ShowAlphaChannel); // 显示透明度选项
colorDia.exec();
// 当点击确定按钮时获取的颜色
QColor color = colorDia.currentColor();
});
3.5 字体选择器
-
QFontDialog 类能够弹出一个字体选择框
-
静态方法:
-
getFont(bool)
-
getFont(bool, QFont())
-
-
QFont 方法
-
setFamily() \ family() : 设置 \ 获取 文本字体
-
setPointSize() \ pointSize() : 设置 \ 获取 字体大小
-
setBold(bool) \ bold() : 设置 \ 获取 文字是否加粗
-
setItalic(bool) \ italic() : 设置 \ 获取 文字是否倾斜
-
connect(ui->fontBtn, &QPushButton::clicked, [=](){
// 方式一: 弹出字体选择框,所有均为默认值
bool flag; // 保存用户最终点击的是 确定 还是 取消
QFont font = QFontDialog::getFont(&flag);
qDebug() << font.family() << font.pointSize() << font.bold() << font.italic();
qDebug() << flag;
});
connect(ui->fontBtn, &QPushButton::clicked, [=](){
// 方式二: 弹出字体选择框,并设置默认值
bool flag;
QFont font = QFontDialog::getFont(&flag, QFont("微软雅黑", 20, true, true));
qDebug() << font.family() << font.pointSize() << font.bold() << font.italic();
qDebug() << flag;
});