一、QMainWindow
QMainWindow是一个为用户提供主窗口程序的类
添加菜单栏
//菜单栏只能最多有一个
// 菜单栏创建
QMenuBar * bar = menuBar();
//将菜单栏放入到窗口中
setMenuBar(bar);
//创建菜单
QMenu * fileMenu = bar->addMenu("文件");
QMenu * editMenu = bar->addMenu("编辑");
//创建菜单项
fileMenu->addAction("新建");
//添加分割线
fileMenu->addSeparator();
fileMenu->addAction("打开");
添加工具栏
//工具栏 可以有多个
QToolBar * toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea, toolBar);
//后期设置 只允许左右停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置浮动
toolBar->setFloatable(false);
//设置移动(总开关)
toolBar->setMovable(false);
//工具栏中可以设置内容
toolBar->addAction(newAction);
//添加分割线
toolBar->addSeparator();
toolBar->addAction(openAction);
//工具栏中添加控件(按钮)
QPushButton * btn = new QPushButton("按钮", this);
toolBar->addWidget(btn);
添加状态栏
//状态栏 最多有一个
QStatusBar * stBar = statusBar();
//设置到窗口中
setStatusBar(stBar);
//放标签控件
QLabel * label = new QLabel("提示信息", this);
stBar->addWidget(label);
QLabel * label2 = new QLabel("右侧提示信息", this);
stBar->addPermanentWidget(label2);
//铆接部件(浮动窗口)可以有多个
QDockWidget * dockWidget = new QDockWidget("浮动", this);
addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
//设置后期停靠区域,只允许上下
dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea);
//设置中心部件 只能一个
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit);
添加头文件
#include<QMenuBar>
#include<QToolBar>
#include<QPushButton>
#include<QStatusBar>
#include<QLabel>
#include<QDockWidget>
#include<QTextEdit>
二、如何添加资源文件
- 在.cpp所在路径放入资源文件
- 工程创建新文件Qt Resource File
- 在.qrc文件中添加前缀(prefix)添加文件,选中路径下的资源文件
- 成功添加资源文件
//使用添加Qt资源 ":+前缀名+文件名"
ui->actionnew->setIcon(QIcon(":/img.png"));
三、创建对话框
//点击新建按钮,弹出一个对话框
connect(ui->actionnew, &QAction::triggered, this, [=](){
//对话框 分类
//模态对话框(不可以) 非模态对话框(可以对其他窗口进行操作)
// //模态创建 阻塞
// QDialog dlg(this);
// dlg.resize(200, 100);
// dlg.exec();
//非模态对话框
QDialog * dlg2 = new QDialog(this);
dlg2->resize(200, 200);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候释放掉
});
//消息对话框
//1.错误对话框
QMessageBox::critical(this, "critical", "错误");
//2.信息对话框
QMessageBox::information(this, "information", "信息");
//3.提示对话框
//参数1父亲,参数2标题,参数3提示内容,参数4按键类型,参数5默认关联回车按键
if(QMessageBox::Save == QMessageBox::question(this, "question", "问题", QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Save)){
qDebug() << "按的是保存";
}
else{
qDebug() << "按的是取消";
}
//4.警告对话框
QMessageBox::warning(this, "warning", "警告");
//颜色对话框
QColor color = QColorDialog::getColor(QColor(255, 0, 0));
qDebug() << "r = "<<color.red();
//文件对话框
//参数1父亲,参数2标题,参数3默认路径,参数4过滤文件格式
QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\r\\Desktop", "(*.txt)");
qDebug() << str;//文件路径
//字体对话框
bool flag;
QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36), this);
qDebug() << "字体:" << font.family() << "字号:" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();
四、界面布局
- 点击.ui打开设计界面
- 拖拽插件,用Widget容器框住插件,点击上面按钮实现水平/垂直布局
- 添加水平/垂直Spacer,让布局更美观(可以调整sizeType为伸缩或固定)
五、控件
ListWidget
QStringList list;
list << "123" << "456" << "789";
ui->listWidget->addItems(list);
TreeWidget
//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");
QTreeWidgetItem * minItem = new QTreeWidget(QStringList()<<"敏捷");
QTreeWidgetItem * zhiItem = new QTreeWidget(QStringList()<<"智力");
//加载顶层的节点
ui->treeWidget->addTopLevelItem(liItem);
ui->treeWidget->addTopLevelItem(minItem);
ui->treeWidget->addTopLevelItem(zhiItem);
//追加子节点
QStringList hero1;
hero1<<"雄鹰"<<"很厉害";
QTreeWidgetItem * l1 = new QTreeWidgetItem(hero1);
liItem->addChild(l1);
TableWidget
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
ui->tableWidget->setItem(0, 0, new QTabelWidgetItem("亚瑟"));
StackedWidget
//scrollArea按钮
connect(ui->btn_scrollArea, &QPushButton::clicked, [=](){
ui->stackedWidget->setCurrentIndex(1);
});
六、自定义控件
- 项目创建新文件->Qt设计师界面类
- 在新创建类的ui界面中组装控件在widget控件中
- 在最初的ui界面中使用widget控件->提升为新创建类(控件的基类和新类的父类要相同)
//QSpinBox移动 QSlider跟着移动
void(QSpinBox:: * spSignal)(int)= &QSpinBox::valueChanged;
connect(ui->spinBox, spSignal, ui->horizontalSlider, &QSlider::setValue);
//QSlider移动 QSpinBox跟着移动
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);
七、Qt中的鼠标事件
//输出语句
//QMouseEvent *ev
QString str = QString("鼠标按下x=%1 y=%2",arg(ev->x()).arg(ev->y()));
qDebug()<<str;
//设置鼠标追踪状态(构造函数)
setMouseTracking(true);
八、定时器
void timerEvent(QtimerEvent *ev)
启动定时器startTimer(1000)毫秒单位
timerEvent的返回值是定时器的唯一标识,可以和ev->timerId作比较
//第二种定时器
#include<QTimer>
QTimer * timer = new QTimer(this);
timer->start(500);
connect(timer, &QTimer::timeout, [=](){
static int num = 1;
ui->label->setText(QString::number(num++));
});
九、事件分发器
//通过event事件分发器 拦截 鼠标按下事件
bool event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent * ev = static_cast<MouseEvent *>(e);//强制类型转换
QString str = QString("");
qDebug() << str;
return true;//true表示用户自己处理这个事件,不向下分发
}
//其他事件 交给父类处理 默认处理
return QLabel::event(e);
}
十、时间过滤器
通过事件过滤器,可以在程序分发到event事件之前再做一次高级拦截
使用 两个步骤:
1.给控件安装事件过滤器
2.重写eventfilter事件
//步骤1 安装事件过滤器
ui->label->installEventFiler(this);
//步骤二 重写EventFilter事件
bool eventFilter(QObject * obj, QEvent * e)
{
if(obj == ui->label)
{
if(e->type() == QEvent::MouseButtonPress){}
}
//其他默认处理
return eventFiler(obj, e);
}