对话框QDialog
模态对话框:不可以对其他窗口进行操作
非模态对话框:可以对其它窗口即进行操作
模态对话框:
connect(ui->actionnew,&QAction::triggered,[=](){
//创建模态对话框
QDialog dlg(this);
dlg.exec(); //阻塞
});
非模态对话框:
connect(ui->actionnew,&QAction::triggered,[=](){
//创建非模态对话框
// QDialog dlg(this);
// dlg.show(); //会一闪而过,因为在栈上
QDialog * dlg = new QDialog(this); //写到堆区
dlg->show(); //不会一闪而过
//设置属性,释放对话框
dlg->setAttribute(Qt::WA_DeleteOnClose);
});
消息对话框QMessageBox
错误提示critical
QMessageBox::critical(this,"critical","错误!");
效果:
信息提示information
QMessageBox::information(this,"information","信息提示");
效果:
询问提示question
//参数1:父窗口 参数2:标题 参数3:中间显示文本 参数4:按键类型 参数5:关联回车按键 后面两个有默认值可以不写
if(QMessageBox::Save == QMessageBox::question(this,"question","询问!",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
qDebug()<<"选择的是保存";
}else{
qDebug()<<"选择的是取消";
}
效果:
警告warning
QMessageBox::warning(this,"warning","警告!");
效果:
其他对话框
颜色对话框QColorDialog
可以选择颜色,默认白色,返回值为QColor类型
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug()<<color.red()<<color.green()<<color.blue();
效果:
字体对话框QFontDialog
bool ok;
QFont font = QFontDialog::getFont(&ok,QFont("宋体",24));
qDebug()<<"字体:"<<font.family()<<"字号:"<<font.pointSize()<<"加粗:"<<font.bold()<<"倾斜:"<<font.italic();
效果:
文件对话框QFileDialog
QString str = QFileDialog::getOpenFileName(this,"打开文件","D:\\Desktop","*.txt");
qDebug()<<str;
效果:
登录界面
步骤:
巧用widgets做布局:水平、垂直、栅格
巧用弹簧进行设置
widgets框太大不好看的情况下
上下左右间隙
固定窗口尺寸:最小尺寸和最大尺寸相等
设计窗口效果
常用控件
Button可以加图片 icon
Tool Button只能放图片或者文字
Radio Button 单选按钮——如果想要选择两组不同的(例如性别和婚姻情况,可以先用Group Box),想要默认先选择某一个选项,去代码中修改
//默认选中男
ui->rBtn_man->setChecked(true);
//监听用户选择女的选项
connect(ui->rBtn_women,&QRadioButton::clicked,[=](){
qDebug()<<"选中女生";
});
CheckBox复选按钮,也可以用Group Box
//监听选中状态
connect(ui->checkBox,&QCheckBox::stateChanged,[=](int state){
qDebug()<<state; //选中的是2 未选中的是0
});
QListWidget控件
//listWidget使用
QListWidgetItem *item = new QListWidgetItem("锄禾日当午");
ui->listWidget->addItem(item);
//设置文本的对齐方式
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
//QStringlist -> QList<QString> -> list<string>
QStringList list;
list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
ui->listWidget->addItems(list);
效果:
用到的知识点:setTextAlignment
QTreeWidget控件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//treewidget 树控件
//1、设置头的标签
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
//2、Item创建
QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");
//添加顶层级别的Item
ui->treeWidget->addTopLevelItem(liItem);
QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList()<<"敏捷");
ui->treeWidget->addTopLevelItem(minItem);
QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList()<<"智力");
ui->treeWidget->addTopLevelItem(zhiItem);
QStringList heroL1,heroL2,heroM1,heroM2,heroZ1;
heroL1<<"扁鹊"<<"中路英雄,一身毒,不小心就会被毒死";
heroL2<<"小乔"<<"中路英雄,一把扇子走天下";
//3、创建子Item 挂载到顶层Item上
QTreeWidgetItem *l1 = new QTreeWidgetItem(heroL1);
liItem->addChild(l1);
QTreeWidgetItem *l2 = new QTreeWidgetItem(heroL2);
liItem->addChild(l2);
}
Widget::~Widget()
{
delete ui;
}
效果展示:
QTableWidget表格控件
做一个王者荣耀英雄基本信息的表格,要求有姓名、性别、年龄,并且能添加新英雄安琪拉
会使用到tablewidget里的findItems函数,添加某一行可以用tablewidget中的insertRow函数,删除某一行可以用removeRow函数
#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//tablewidget的使用
//1、先设置列数
ui->tableWidget->setColumnCount(3);
//2、设置水平表头标签
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//3、设置行数
ui->tableWidget->setRowCount(5);
// ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
QStringList nameList,sexList;
nameList<<"亚瑟"<<"妲己"<<"扁鹊"<<"艾琳"<<"李信";
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[i]));
//int 转 QString
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18+i)));
}
//点击添加安琪拉 实现添加
connect(ui->btn_add,&QPushButton::clicked,[=](){
//如果有安琪拉,就不添加
bool isEmpty = ui->tableWidget->findItems("安琪拉",Qt::MatchExactly).isEmpty();
if(!isEmpty)
{
QMessageBox::warning(this,"警告","已经有安琪拉,添加失败");
}
else
{
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,new QTableWidgetItem(QString("安琪拉")));
ui->tableWidget->setItem(0,1,new QTableWidgetItem(QString("女")));
ui->tableWidget->setItem(0,2,new QTableWidgetItem(QString::number(17)));
}
});
//点击删除
connect(ui->btn_del,&QPushButton::clicked,[=](){
bool isEmpty = ui->tableWidget->findItems("安琪拉",Qt::MatchExactly).isEmpty();
if(isEmpty)
{
QMessageBox::warning(this,"警告","没有安琪拉,删除失败");
}
else
{
int row = ui->tableWidget->findItems("安琪拉",Qt::MatchExactly).first()->row(); //找到第一个安琪拉位置
ui->tableWidget->removeRow(row);
}
});
}
Widget::~Widget()
{
delete ui;
}
效果:
其他控件
Scroll Area:滚动条
Tool Box:类似QQ主页(家人、陌生人)
Tab Widget:类似网站开发
Stacked Widget:切换的网页(可以把上边的几个控件都放进去,然后来回切换),但是需要其他控件的支持,如PushButton。查看ui中的currentIndex(),使用connect()来实现
Combo Box:下拉框,想要添加下拉选项用addItem(),里边也用setCurrentIndex()来确定选项的位置,或者用文本来确定位置setCurrentText()
Line Edit:输入密码时想要隐藏文本,可以点击echoMode中的NoEcho(看不见)或者Password(都是点)
Label:可以放文字或图片 ui->label_Img->setPixmap(QPixmap(":/Image/picture.png")); 也可以指定图片大小:setFixedSize(pix.width(),pix.height()); 也可以放置动图gif:label_movie,movie->start()播放gif
停止gif播放的代码:
connect(movie,&QMovie::frameChanged,[=](int frameId){
if(frameId == movie->frameCount()-1)
{
movie->stop;
}
});
自定义控件的封装
创建一个设计师界面类(右键)
会生成.h .cpp .ui三个界面
在ui文件中设计自己的自定义控件
在主窗口中拖拽一个Widget做提升:右键提升为,提升的名称为上边设计师界面的名字,提升成功右边对象和类中会变成提升的名字。
上一步完成结束后,运行会有自己定义的控件。
自定义控件的功能
smallwidget.h中
smallwidget.cpp中
widget.cpp中
效果: