qt学习

Q_OBJECT

允许使用信号和槽的机制

1
2
myWidget(QWidget *parent=nullptr);//有参构造函数

命名规范

类名 首字母大小,单词和单词之间首字母大写

函数名 变量名称 首字母小写,单词和单词之间首字母大小

快捷键

image-20220729212448195

1
2
3
4
5
6
7
8
9
10
11
12
13

//注释
ctrl +/
运行ctrl + r
编译ctrl + b
字体缩放ctrl +鼠标滚轮
查找ctrl + f
整行移动ctrl + shift +:或者↓
帮助文档F1
自动对齐ctrl + i
同名之间的.h和.cpp切换F4
//帮助文档第一种方式F1第二种左侧按钮

Qlabel使用

1
2
3
4
5
6
7
8
9
10
QLabel *label =new Qlabel(widget)
Label->setTxet("文字")//在出现的文字
Label->setAlignemt(QT::AlignCenter)//居中显示
QFont font("文字类型",字号,QFont::Bold,true);
label->setFont(font)//设置字体
label->setStyleSheet("color:red")//设置颜色
label->setStyleSheet("image:url(路径)")//图片可以一起伸缩
QPixmap pix("绝对路径");
label->setPixmap(pix);//显示图片
label->setScaledContents(true)//图片大小不变,可以伸缩

QPushButton

1
2
3
4
5
6
7
8
9
10
QPushButton *btn=new QPushButton;
btn->setparent()//设置按钮
btn->setText("")//文本
btn->resize();//修改
btn->move();
setWindowTitle();//设置窗口标题
setFixedSize()//设置规定窗口大小



信号量和槽函数

QPushButton
1
2
3
4
5
6
7
8
9
10
QPushButton *btn =new QPushButton("wenz1",this);
设置窗口大小
resize(600,400);
btn->move(宽,高);
设置窗口标题
setWindowTitle("sjj");
设置固定窗口大小
setFixedSize(600,400);
按钮大小设置
btn->resize();

对象模型(对象树)

image-20220729215033012

制动调用析构函数,对象树可以直接递归释放。

qt坐标系从左到右x,从上到下y轴

信号量和信号槽

跟着父类找到槽函数

1
2
3
4
5
6
7
8
9
10
connect(信号发送者,SIGNAL发送的具体信号,信号的接收,Slot()信号处理 槽)//类型不做比较
connect(信号发送者,SIGNAL发送的具体信号,信号的接收,Slot()信号处理 槽)
QPushButton SIGNAL:
pressed()//挤压
clicked(),
released(),
toggled();
Qwidget slot
close
hide;

自己定义信号量和槽

1
2
3
4
5
6
7
signal:
//没返回值,可以又参数可以重载,不需要实现
void hungry();
public slots:
返回void ,有参数,有值,有返回
列子:

自定义的信号和槽发生重载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
signal:
//没返回值,可以又参数可以重载,不需要实现
public slots:
返回void ,有参数,有值,有返回
列子:老师 下课 学生请老师吃饭 信号与槽;
老师 signal:
void class();
void class(QString str);
学生
public slots:
void eat();
void eat(QString str);
void studnet::eat()
{
qDubeg<<"eat";
}
.h
public:
void sprint();

private:
student *st;
teacher *te;

.cpp
this->st=new student(this);
this->te =new teacher(this);
重载情况
指针->地址
void(student:: *studentslot)(QString)=&student::eat;
void(teacher:: *teachersignal)(QString)=&teacher::class;
connect(te,teachersignal,st,studentslot);
sprint();

void ::sprint()
{
emit te->class("123");
}

//信号和槽参数个数 可以不一致,信号可以多余参数
void(teacher:: *teachersignal)(QString,int)=&teacher::class;


信号连接信号
void(student:: *studentslot)(void)=&student::eat;
void(teacher:: *teachersignal)(void)=&teacher::class;
QPushButton *abutton=new QPushButton("",this);
connect(abutton,&QPushButton::clicked,st,studentslot);//信号连接信号

lamada表达式

1
2
3
4
5
6
7
8
9
10
[](存放参数){}();,lamada表达的标志
=值传递||and
列子:
[=](){
btn->setText("123");
}();
mutable修改拷贝数值
int m=10;
[m]()mutable{m=100+10}

image-20220730002514382

QMainWindow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
QMainwindow()
QMenuBar *bar=menuBar();/菜单栏
setMenuBar(bar);
QMenu *fileMenu = bar->addMenu("文件");
fileMenu->addSeparator();//文件分割线
fileMenu->addAction();
QToolBar *toolbar=new QToolBar(this);//工具栏
addToolBar(QT::LeftToolBarArea,toolbar);
toolbar->addAction();
toolbar->widget(bar);
resize(400,600);
QMenuBar *bar=menuBar();
setMenuBar(bar);
QMenu *fileMenu= bar->addMenu("文件");
QMenu *siet=bar->addMenu("编辑");
fileMenu->addAction("新建");//创建菜单项
QAction *addfile=fileMenu->addAction("打开");
fileMenu->addSeparator();
fileMenu->addMenu("123");//菜单中加菜单

//工具栏
QToolBar *toolbar=new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolbar);
toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
toolbar->setFloatable(false);
toolbar->setMovable(true);
toolbar->addAction(addfile);
toolbar->addAction("打开");
QPushButton *bat=new QPushButton;
toolbar->addWidget(bat);//添加按钮


状态栏的学习
QStatusBar *statubar=statusBar();
setStatusBar(statubar);
QLabel *label =new QLabel("提示",this);
statubar->addWidget(label);
QLabel *label1=new QLabel("righit",this);
statubar->addPermanentWidget(label1);

//设置后期停靠区域,只允许上下
dockwidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);

//铆接部件(浮动窗口)可以多个
QDockWidget *dockwidget =new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockwidget);//设置浮动

//设置中心部件
QTextEdit * edit=new QTextEdit(this);//文本编辑中间文本
setCentralWidget(edit);
创建菜单,工具栏,状态栏
资源文件
1
2
3
4
5
6
7
8
9
10
11
12
13
ui,直接操作

将文件保存到项目下

右键项目->添加新文件->QT->QT resourse File ->给资源文件起名

res生成res.qrc

open in editor 编辑资源

添加前缀 添加文字

使用“:+前缀+文件名“

对话框

模态对话框(不可以) 非模态对话框(可以对其他窗口操作)

1
2
3
4
5
6
7
8
9
10
//模态对话框,不可以对其他窗口操作
QDialog dlg(this);
dlg.resize(200,200);
dlg.exec();
qDebug()<<"模态对话框弹出";

//非模态对话框,可以对其他窗口操作
QDialog *dil=new QDialog(this);
dil->setAttribute(Qt::WA_DeleteOnClose);//防止内存泄露
dil->show();
消息对话框(系统提供的对话框)
1
2
3
4
5
6
7
8
9
10
11
//消息对话框
QMessageBox::critical(this,"critical","错误");//提示错误
//信息对话框
QMessageBox::information(this,"123","ok");
//问题对话框 参数1 父亲指针 参数2 标题 参数3 提示内容 参数4 按键类型 参数5 默认关联回车按建

if (QMessageBox::Save == QMessageBox::question(this,"123","meiwent",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Save));//
{
qDebug()<<"选择的是什么";
}
QMessageBOX::warning(this,"waring","警告");
其他系统对话框
1
2
3
4
5
6
7
8
9
10
11
 //颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,0));//透明度
qDebug()<<"r="<<color.red()<<"g="<<color.green()<<"b="<<color.blue();
//文件对话框 参数1 父亲 参数2 标题 参数3 默认打开路径 参数4 过滤文件格式
QString str =QFileDialog::getOpenFileName(this,"打开文件","E:\\Uers","*txt");//最后过滤文件;
qDebug()<<str;//文件路径
//字体对话框
bool flag;
QFont font=QFontDialog::getFont(&flag,QFont("华文彩云",36));
qDebug()<<"字体"<<font.family().toUtf8().data()<<"字号"<<font.pointSize()<<"是否加粗"<<font.bold()<<"是否倾斜"<<font.italic();
font.family().toUtf8().data()//转字符的使用让QString转为

ui界面布局

1
2
3
4
5
6
7
8
9
10
列子:实现登录窗口
选取QWidget进行布局,水平布局,垂直布局,栅格布局
给用户名,密码,登录,退出按钮进行布局
默认窗口有间隙9,用layoutLeftMargin
Horuzontal Spacer弹簧使用
label
lineEIdit()
ui->setWindowsize();//修改大小
ui->setWindowfile();//修改名字

ui控件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
按钮:
QPushButton 常用按钮
QToolButton 工具按钮 用于显示图片
toolButtonStyle,风格设置,凸起风格autoRaise
radioButton 单选按钮,设置默认Ui->xx->setChecked(bool);
checkBox 多选按钮,监听状态,2选中,1半选中,0未选中


QListWidget列表容器
QListWidgetitem *itme=new QListWidgetItem;
ui->listWidget->additem(item)
item->setTextAlignment(Qt::AlignHCenter/*中心居中*/);//设置list中居中方式
QStringList list;//QList<QString>
list<<"123"<<"456";
listWidget->additems(list);可以添加整个QString,利用list设置宽度
QTreeWidget 树控件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//treeWidget 树控制件使用
//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
QTreeWidgetItem *liItem= new QTreeWidgetItem(QStringList()<<"力量");
QTreeWidgetItem *minItem=new QTreeWidgetItem(QStringList()<<"智力");
QTreeWidgetItem *maxItem=new QTreeWidgetItem(QStringList()<<"速度");
//加载顶层的节点
ui->treeWidget->addTopLevelItem(liItem);
ui->treeWidget->addTopLevelItem(minItem);
ui->treeWidget->addTopLevelItem(maxItem);

//追加子节点
QStringList str;
str<<"我我"<<"ok";
QTreeWidgetItem *man=new QTreeWidgetItem(str);
liItem->addChild(man);//追加子节点
QTableWidget控件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//TableWidget 控件
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置表格文件
QStringList name;
QList<QString>sex;
name<<"1"<<"2"<<"3"<<"4"<<"5";
sex<<"11"<<"22"<<"33"<<"44"<<"55";

//添加数据
for(int i=0;i<5;i++){
int clo=0;
ui->tableWidget->setItem(i,clo++,new QTableWidgetItem(name[i]));//
ui->tableWidget->setItem(i,clo++,new QTableWidgetItem(sex.at(i)));//
ui->tableWidget->setItem(i,clo++,new QTableWidgetItem(QString::number(i+1)));

}

7.31

其他插件按钮的设置

image-20220731155644662

封装框架
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
使用
QSpinBox;
QSlider;
制作简单框架smallwidget
封装在widgetui上
//QSpinBox移动 QSlider移动
void(QSpinBox:: *qspinbox)(int)=&QSpinBox:: valueChanged;
void(QSlider:: *setvalue)(int)=&QSlider:: setValue;//valueChanged在QSpinBox中出现重载

connect(ui->spinBox,qspinbox,ui->horizontalSlider,setvalue);//设置连载QSpinBox与QSlider
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
使用widget按钮连接smallwidget
connect(ui->getNum,&QPushButton::clicked,[=](){
qDebug()<<ui->widget->getNum();
});
connect(ui->setNum,&QPushButton::clicked,[=](){
ui->widget->setNum(i);
});
int smallwidget::getNum()//得到QSpinBox的值
{
retrun ui->spinBox->value();
}
int smallwidget::getNum(int num)//设置QSpinBox的值
{
ui->spinBox->setValue(num);
}



鼠标控制事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QEvent;//事件
QEnterEvent;
widget中的
enterEvent(QEvent*evnet);
leaveEvent(QEvent *);
QLabel中的鼠标事件
virtual void mouseMoveEvent(QMouseEvent *ev)
{
获取arg(ev->x)//获取坐标;
}
virtual void mousePressEvent(QMouseEvent *ev)
virtual void mouseReleaseEvent(QMouseEvent *ev)
if(ev->buttons()&Qt::LeftButton)//鼠标左键判断
QEvent::MouseTrackingChange(true)://设置鼠标的追踪状态,不需要press

定时器事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
设置QLabel定时器
QTimerEvent;
启动方式
//定时器启动1
id=startTimer(1000);
if(ev->timerId()==id)
{
ui->label->setText(QString ::number(num++));
}
//定时器启动2
//定时器启动2
QTimer *star=new QTimer(this);
star->start(500);
connect(star,&QTimer::timeout,ui->label_3,[=](){
static int num=1;
ui->label_3->setText(QString::number(num++));
});
connect(ui->pushButton,&QPushButton::clicked,ui->label_3,[=](){
star->stop();
});//设置暂停按钮
connect(ui->pushButton_2,&QPushButton::clicked,[=](){
star->start(500);
});//启动按钮

event事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
事件分发器使用
通过事件分发器拦截:
拦截鼠标点击
bool event(QEvent *);
e->type()://判断事件类型
QEvent *e;
if(e->type()==QEvent::MouseButtonPress)
{QMouseEvent *ev=static_cast<QMouseEvent>(e);//必须强转类型

return true;//true用户直接处理这个事件
}
//其他事件交个父类出来
return QLabel::event(e);

事件过滤器

image-20220731202400160

QPainter绘图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 //实例化画家对象 this指定的是绘图设备
QPainter painter(this);
//设置画笔
QPen pen(QColor(255,0,0));
//设置画笔宽度
pen.setWidth(3);
//设置画笔风格
pen.setStyle(Qt::DotLine);
//使用这个笔
painter.setPen(pen);

//设置画刷颜色
QBrush brush(QColor(0,255,0));

//使用画刷
painter.setBrush(brush);
//画刷风格
brush.setStyle(Qt::Dense1Pattern);
//画线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画园
painter.drawEllipse(QPoint(100,100),50,50);
//矩阵
painter.drawRect(QRect(20,20,50,50));
//文字
painter.drawText(QRect(10,20,150,50),"好好学习,123456");
利用update();调用绘图事件
painter.drawPixmap(x,y,QPixmap(文件));//使用绘画画图片

绘画设备继承QPainterDevice的子类的使用。
QPixmap;显示的优化
QPixmap pix(30,30);
pix.fill()填充颜色
QPainter painter(&pix);//在pix图画
pix.save();

QImage;像素修改
QImage img(300,300,Qlmage::Foramt_RGB32);
QRgb value=qRgb(255,0,0);
img.setPixel(i,j,value);修改图画的像素点

QPicture记录和重现绘图
QPicture pic;
painter.begin(&pic);开始向pic上面绘画
painter.end();
pic.save(后缀名任意)保存图片
painter.drawPicture(0,0,,pic);重现绘画
QBitmap;(黑白色)
file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
文件操作
弹窗选取文件
QString path=QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Admin\\Desktop");
设置文本显示的编码0.
+
0方式
QTextCodec *codec=QTextCodec::codecForName("gbk");
以编码方式显示
ui->textEdit->setText(codec->toUnicode(array));
读取文件内容
QFile file(path);//读取文件内容,参数是文件路径
file.open(QIODevice::ReadOnly);//只读方式打开
读取所有行
QByteArray array=file.readAll();//读取所有内容
逐行读取
QByteArray array;
while(!file.atEnd()){
array+=file.readLine();//按行读取 }
放入文本框显示
ui->textEdit->setText(array);//将读取到的数据放入 textEdit 中
关闭文件
file.close();
写入文件
file.open(QIODevice::Append);//追加方式进行写
file.write("啊啊啊");
file.close();
文件信息类
定义
QFileInfo info(path);
打印信息
qDebug()<<"大小:"<<info.size()<<" 后缀名:"<<info.suffix()<<" 文件名称:"<<info.fileName()<<" 文件路径:"<<info.path();
qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss"); //添加 头文件 #include<QDateTime>
qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy - MM - dd hh:mm:ss");
说明
查看帮助QDataTime ->toString 里面列举了单独取出年、月、日