Qt开发学习笔记
项目开发个人Qt学习记录,前期只是学习相关概念,记录一些基础知识,后面会补充一些具体的操作实例
文章目录
五、标准对话框
标准对话框,是qt内置的一系列对话框,用于简化开发。有很多对话框都是通用的,例如打开文件、设置颜色、打印设置等。
qt的内置对话框大致分为以下几类:
- QColorDialog:选择颜色
- QFileDialog:选择文件或者目录
- QFontDialog: 选择字体
- QInputDialog:允许用户输入一个值,并将其值返回
- QMessageBox:模态对话框,用于显示信息、询问问题等
- QPageSetupDialog:未打印机提供纸张相关的选项
- QPrintDialog:打印机配置
- QPrintPreviewDialog:打印预览
- QProgressDialog:显示操作过程
消息对话框
消息提示对话框的函数参数意义:父亲窗口,对话框标题,提示信息,(按键名称可多选),默认关联回车的按键
函数的返回类型是StandardButton类型,利用返回值判断用户的输入
消息对话框有这么几种类型:
-
错误提示对话框
-
信息对话框
-
提问对话框(离开时退出还是不退出)
-
警告对话框
/*头文件:QMessageBox*/
//消息对话框的几种类型
//错误提示对话框
QMessageBox::critical(this(父亲),"critical"(对话框标题),"错误"(提示信息));
//信息对话框
QMessageBox::information(this,"info","信息");
//提问对话框
QMessageBox::question(this,"ques","退出?",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);
//判断选择结果
if(QMessageBox::Save == QMessageBox::question(this,"ques","退出?",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
qDebug<<"选择了保存";
}
else
{
QDebug<<"选择了取消";
}
//警告对话框
QMessageBox::warning(this,"warn","警告");
其他对话框
-
颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,255(透明值))); qDebug<<"r = "<<color.red() <<"g = "<<color.green()<<"b = "<<color.bule();
-
文件对话框(打开某一文件目录)
/*头文件:QFileDialog*/ //参数类型 父亲 对话框标题 默认路径 过滤的文件格式 //返回值是选取的路径 QString str = QFileDialog::getOpenFileName(this,"打开目录","C:\\Users\\86187\\Desktop","(*.txt)"); qDebug<<str;
-
字体对话框
/*头文件:QFontDialog*/ bool flag; QFont font = QFontDialog::getFont(&flag,QFont("仿宋",24)); qDebug<<"字体:"<<font.family().toUtf8().data()<<"字号:"<<font.pointsize()<<"是否加粗:"<<font.bold()<<"是否斜体:"<<font.italic();
六、界面的布局
实现登录窗口布局
- 1)利用布局方式,给窗口进行美化
- 2)选取widget进行布局,水平布局、垂直布局、栅格布局
- 3)给用户名、密码、登录、退出按钮进行布局
- 4)默认窗口和控件之间有9间隙,可以调整LayoutLeftMargin
- 5)利用弹簧进行布局
七、常用控件
1.按键组
- QPushButton:常用按钮(ok、cancel、save…)
- QToolButton:工具按钮,用于显示图片,若想修改图片风格,修改toolButtonStyle,突起风格autoRaise
- radioButton:单选按钮,设置默认(如下代码所示)
- checkBox:多选按钮,监听状态
//设置单选按钮 男默认选中
ui->rntnMan->setChecked(true);
//选中女后 打印信息
connect(ui->rbtnWomen,&QRadionButton::clicked,[=](){
qDebug<<"选中女了";
});
//多选按钮 0未选中 2 选中 1半选
connect(ui->cBox,&QCheckBox::stateChanged,[=](){
qDebug<<state;
});
2.QListWidget控件(列表容器)
//利用ListWidget写诗
QListWidgetIten * item = new QListWidgetItem("不知天上宫阙");
//将一行诗放到Listwidget控件中
ui->listWidget->addItem(item);
item->setTextAlihnment(Qt::AlignHCenter);//设置水平居中
//一次放入一组诗句
QStringList list;//等同于QList<Qstring>
list<<"不知天上宫阙"<<"今夕是何年"<<"我欲乘风归去";
ui->listWidget->addItems(list);
3.QTreeWidget树控件
示例:
流程:
- 设置头
- 创建根节点
- 添加根节点到树控件上
- 添加子节点
//TreeWidget树控件使用
//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"人物角色介绍");//QStrinList()用到了匿名对象
QTreeWidgetItem * wangItem = new QTreeWidgetItem(QStringList()<<"王者荣耀");
QTreeWidgetItem * chiItem = new QTreeWidgetItem(QStringList()<<"和平精英");
//加载顶层结点
ui->treeWidget->addTopLevelItem(hongItem);
ui->treeWidget->addTopLevelItem(xiItem);
//追加子节点
QStringList role1;
role1<<"王昭君"<<"法师、控制、团位";
QTreeWidgetItem * r1 = new QTreeWidgetItem(r1);
hongItem->addChild(r1);
4.QTableWidget表格控件
示例:
流程:
- 设置列数
- 设置水平表头
- 设置行数
- 设置正文
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平头
ui->tableWidget->setHorizontalHeaderLabels(QString()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(3);
//设置正文
//ui->tableWidget->setItem(0(行坐标),0(列坐标),new QTableWidgetItem("张三"));
//多项同时设置正文
QstringList nameList;
nameList<<"张三"<<"李四"<<"王麻子";
QList<QString> sxList;
sexList<<"男"<<"男"<<"男";
for(int i=0;i<3;++i)
{
int col = 0;
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList[i]));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+20)));
}
5.其他常用控件
栈控件
//栈控件使用
//设置默认定位 scrollArea
ui->stackedWidget->setCurrentIndex(1);
//scrollArea按钮
connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
//toolBox按钮
connect(ui->btn_TolBox,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
//TabWidget按钮
connect(ui->btn_TabWIdget,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
下拉框控件
//下拉框
ui->comboBox->addItem("红楼梦");
ui->comboBox->addItem("西游记");
ui->comboBox->addItem("三国演义");
ui->comboBox->addItem("水浒传");
//点击按钮 选中水浒传
connect(ui->btn_select,&QPushButton::clicked,[=](){
ui->comboBox->setCurrentText("水浒传");
//ui->comboBox->setCurrentIndex(3);
})
QLabel标签控件
//利用QLabel显示图片
ui->ibl_Image->setPixmap(QPixmap(":/Image/xxx.png"));
//利用QLabel显示动图
QMovie * movie = new QMovie(":/Image/mario.gif");
ui->ibl_movie->setMovie(movie);
//播放动图
movie->start();
6.自定义控件封装
- 1)添加新文件 -》Qt设计师界面类 (.h .cpp)
- 2).ui中设计 QSpinBox 和 QSlider两个控件
- 3)Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升,填对类名称(建议选择全局
- 4)实现功能,改变数字,滑条跟着滑动,信号槽监听
- 5)提供getNUm和setNum对外接口
- 6)测试接口
SpinBox(数字控件)和horizontalSlider(水平滑动控件)组合为一组控件:
//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中的鼠标事件
鼠标事件
鼠标进入事件:enterEvent
鼠标离开事件:leaveEvent
鼠标按下:mousePressEvent (QMouseEvent *ev)
鼠标释放:mouseReleaseEvent
鼠标移动:mouseMoveEvent
ev->x() x坐标 ev->y() y坐标
ev->button() 可以判断所有按键 Qt::LeftButton Qt::rightButton
ev->buttons() 可以判断组合按键, 判断move的时候结合 & 操作符
格式化字符串 QString(“%1 %2”).arg(111).arg(222)
//鼠标进入事件
void enterEvent(Qevent* event);
//鼠标离开事件
void leaveEvent(QEvent *);
//鼠标按下
virtual void mousePressEvent(QMouseEvent* ev);
//鼠标释放
virtual void mouseReleaseEvent(QMouseEvent * ev);
//鼠标移动
virtual void mouseMoveEvent(QMouseEvent* ev);
//鼠标进入事件
void myLabel::enterEvent(Qevent* event)
{
qDebug()<<"鼠标进入了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *event)
{
qDebug()<<"鼠标离开了";
}
//鼠标按下
void myLabel::mousePressEvent(QMouseEvent* ev)
{
qDebug()<<"鼠标按下了";
}
//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent * ev)
{
qDebug()<<"鼠标释放了";
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent* ev)
{
QString str = QString("鼠标按下了 x = %1 y = %2 ").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
//当鼠标按下 提示信息
if( ev->button() == Qt::LeftButton)
{
QString str = QString("鼠标按下了 x = %1 y = %2 ").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
效果:
九、定时器
1.利用定时器事件 void timerEvent(QTimerEvent * ev)
在widget.h中去重写定时器的方法:
//在构造中进行启动定时器
starttimer(1000); //参数1 间隔 单位码毫秒
void Widget::timerEvent(QTimerEvent *)
{
static int num =1;
ui->label->setText( QString::number(num++));
}
//两个不同需求的定时器
//定义两个定时器标识(公有成员变量)
int id1,ind2;
//在构造中进行启动定时器
id1= startTimer(1000); //参数1 间隔 单位码毫秒
id2 = startTimer(2000);
void Widget::timerEvent(QTimerEvent *)
{
if(ev->timerId == id1)
{
//label1 每个1秒 +1
static int num =1;
ui->label->setText( QString::number(num++));
}
if(ev->timerId == id2)
{
//label2每个2秒 +1
static int num2 =1;
ui->label->setText( QString::number(num2++));}
}
2.利用Timer类来做定时器(这种比较独立)
QTimer * timer = new QTimer(this);
//启动定时器
timer->start(500);
connect(timer,&QTimer::timeout,[=](){
static num =1;
//label3 每隔0.5秒 +1
ui->label3->setText(QString::number(num++));
});
//点击暂停按钮 实现停止定时器
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
十、event事件分发器
event事件:
- 用于事件的分发
- 可以做拦截,但是不建议
- bool event(QEvent *e)
- 返回值 如果是true代表用户处理了这个事件,不向下分发了
- e->type() == 鼠标按下 ,这样类似的来判断
十一、事件过滤器
- 1)给控件安装事件过滤器
ui->label->installEventFilter(this);
- 2)在widget.h中重写事件过滤器的事件
bool eventFilter(QObject * ,QEvent *);
//步骤2 重写eventFilter事件
bool eventFilter(QObject * obj,QEvent *e)
{
if( obj == ui->label )
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent * ev = static_cast<QMouseEvent*>(e);
QString str= Qstring("事件过滤器中:鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;
}
}
//其他默认处理,交给父类
return QWidget::eventFilter(obj,e);
}
十二、绘图事件
1.绘图
//绘图事件
void paintEvent(QPainEvent *);
void widget::paintEvent(QPaintEvent*)
{
//实例化画家对象 this指定的是绘图设备
QPainter Painter(this);
//先设置画笔
Qpen pen(QColor(255,0,0));//红色
//设置画笔宽度
pen.setWidth(30);
//设置画笔风格
pen.setStyle(Qt::DotLine);
//让画家 使用这个画笔
painter.setPen(pen);
//设置画刷
QBrush brush(Qt::cyan);
//设置画刷风格
brush.setStyle(Qt::Dense7Pattern);
//让画家使用画刷
painter.setBrush(brush);
//画线
painter.drawLine(QPoint(0,0), QPoint(100,100));
//画圆 椭圆
painter.drawEllipse(QPoint(100,100),100,50);//参数 圆心左边,rx,ry
//画矩形
painter.drawRect(QRect(20,20,50,50));
//画文字
painter.drawText(QRect(10,200,150,50),"玫瑰色花猫");
}
画笔的风格(Qt::PebStyle):
:67%;" />
画刷的风格:
2.QPainter高级设置
QPainter painter(this);
painter.drawEllipse(QPoint(100,50),50,50);
//设置 抗锯齿能力(清晰度) 升高效率会低
painter.setRenderHint(QPainter::Antiliasing);//清晰
painter.drawEllipse(QPoint(200,50),50,50);
//画矩形
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);//画家移动了位置
//保存画家位置
painter.save();
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);//画家移动了位置
//还原画家保存状态
painter.restore();
painter.drawRect(QRect(20,20,50,50));
3.手动调用绘图事件
//利用画家 画资源图片
//实例化画家对象 this指定的是绘图设备
QPainter Painter(this);
painter.drawPixmap(20,0,QPixmap(":/Image/xx.png"));
//点击按钮,移动图片
//widget.h中添加 posX成员变量表示画家位置
int posX;
//构造函数中 连接信号和槽
connect(ui->btn,&QPushButton::clicked,[=](){
PosX+=10;
//若要手动调用绘图事件 用update()
update();
});
void widget::paintEvent(QPaintEvent*)
{
//实例化画家对象 this指定的是绘图设备
QPainter Painter(this);
//如果超出屏幕 从0开始
if(posX> this->width())
{
posX=0;
}
painter.drawPixmap(posX,0,QPixmap(":/Image/xx.png"));