QT学习日记
一.QWidget
版本选择:win下选择MINGW (编码UTF-8)
选择Qwidget之后勾选mingw不然会报错
初识main.cpp
详解:
#include "widget.h"
#include <QApplication>
//main程序入口
int main(int argc, char *argv[])
{
//应用程序对象有且仅有一个
QApplication a(argc, argv);
//窗口对象Widgt继承父类QWidget
Widget w;
//show方法
w.show();
//消息循环,不会结束
return a.exec();
}
pro文件解释
//QT的核心模块
QT += core gui
//大于4以上才有widgets版本
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//目标文件
TARGET = Demo01
//模板--application
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11
//源文件
SOURCES += \
main.cpp \
widget.cpp
//头文件
HEADERS += \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
命名规范
类名:首字母大写,单词与单词直接首字母大写
函数名:首字母小写,单词与单词首字母大写[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wMnlWjO-1617466776739)(Lily_Screenshot_1608472881.png)]
查找ctrl+f
自动对齐Ctrl+i
同名.h和.cpp切换f4
写代码了
QPushButton *button =new QPushButton();
//以顶层弹出
//button->show();
//让button依赖在Widget中显示,setParent是设置一个父窗口
button->setParent(this);
//这个设置要在下面,这是底层的问题
ui->setupUi(this);
带参数构造
发现与原来的按钮重叠
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7SEwuVW-1617466776741)(Lily_Screenshot_1608474766.png)]
//窗口固定大小
setFixedSize(600,400);
指定父类就会把子类添加到对象树里面,这样析构的时候就会释放对象树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRrEnGG9-1617466776745)(image-20201220232553431.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpybSAjz-1617466776747)(image-20201220235015356.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNcLMhHi-1617466776749)(image-20201220234957297.png)]
坐标体系
左上角向下y向右x
信号和槽
信号的处理(槽函数)
优点:接受和发送没有关联
1.实现功能点击按钮关闭窗口
按钮名字,&类名地址::信号,窗口名字,&类名地址::槽函数
//设置按钮button2关闭窗口
connect(button2,& QPushButton::clicked , this , & QWidget::close);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8r3KG4v6-1617466776750)(image-20201221123927942.png)]
自定义信号
信号在建立类之后会有,默认继承Qobject类不用释放
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZltgUkY-1617466776752)(image-20201221131238328.png)]
signals:
//只要声明不用实现
//返回一个void就行
void classover();
自定义槽
打印函数
头文件定义槽
cpp重写槽函数
#include "student.h"
#include<QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::Food()
{
qDebug()<<"下课吃饭了";
}
在widget的头文件里面写入private的对象
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"teacher.h";
#include"student.h";
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher *teacher;
Student *student;
connect(zyq,&Teacher::classover,lpy,&Student::Food);
Classover();
}
Widget::~Widget()
{
delete ui;
}
void Widget::Classover(){
//触发下课的信号
emit zyq->classover();
}
};
先创建对象,再建立连接,最后调用函数触发信号( emit zyq->classover();)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrSjy6vg-1617466776753)(image-20201221234232202.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zMirtRv-1617466776754)(image-20201221234547927.png)]
qDebug()<<“XXX is sb”
//重载函数后,连接会不明确指向的是哪个函数,需要手动void 一个地址
void (Teacher::*tea)(QString)=&Teacher::classover;
void (Student:: *stu)(QString)=&Student::Food;
connect(zyq,tea,lpy,stu);
Classover();
string转换为 char * (utf-8.data)
qDebug()<<"老师要吃"<<FoodName.toUtf8().data();
信号连接信号
//无参信号和槽连接
void (Teacher:: *teaSignal(void)=&Teacher::classover;
void (Student:: *stuSlot)(void)=&Student::Food;
connect(zyq,teaSignal,lpy,stuSlot);
//信号连接信号
connect(button,&QPushButton::clicked,zyq,teaSignal);
//断开连接
disconnect(zyq,teaSignal,lpy,stuSlot);
拓展
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udkJ10Xs-1617466776755)(image-20201222151936461.png)]
Lambda表达式
[button](){
button->setText("aaaaa");
}();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dplr0Dpd-1617466776756)(image-20201222154708320.png)]
mutable声明修改只读状态,并且只修改拷贝的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnTw6jhb-1617466776757)(image-20201222160024268.png)]
建立连接
void (Teacher:: *tea)(QString)=&Teacher::classover;
void (Student:: *stu)(QString)=&Student::Food;
connect(zyq,tea,lpy,stu);
//使用lambda表达式关闭窗口
QPushButton *btn=new QPushButton("close",this);
connect(btn, &QPushButton::clicked, this, [this](){
this->close(); }
emit zyq->classover("cc");
);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJOfsYOT-1617466776758)(image-20201222185244348.png)]
二.QMainWindow
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaJeOM8z-1617466776759)(image-20201222183411211.png)]
1.菜单项目
//创建菜单MenuBar
QMenuBar *bar= menuBar();
//放入窗口
//包含头文件 #include<QMenuBar>
setMenuBar(bar);
//创建菜单
QMenu *menu01= bar->addMenu("病人名单");
QMenu *menu02= bar->addMenu("医生名单");
QMenu *menu03= bar->addMenu("病例记录");
QMenu *menu04= bar->addMenu("太平间记录");
//创建菜单项
menu01->addAction("许音");
menu01->addAction("张雅");
//分隔符
menu01->addSeparator();
menu01->addAction("红衣");
menu01->addAction("高枝");
2.添加工具栏
//Location
Constant
Value
Qt::LeftToolBarArea
0x1
Qt::RightToolBarArea
0x2
Qt::TopToolBarArea
0x4
Qt::BottomToolBarArea
0x8
Qt::AllToolBarAreas
ToolBarArea_Mask
Qt::NoToolBarArea
0
//添加工具栏
QToolBar *toolbar=new QToolBar(this);
addToolBar(Qt::RightToolBarArea,toolbar);
//只允许左右停靠
toolbar->setAllowedAreas(Qt::RightToolBarArea | Qt::LeftToolBarArea);
//设置浮动
toolbar->setFloatable(true);
//设置移动(权值大于前面)
toolbar->setMovable(false);
// 设置action
toolbar->addAction(xuyin);
toolbar->addAction(zhangya);
toolbar->addSeparator();
QPushButton *btn=new QPushButton("destroy",this);
toolbar->addWidget(btn);
addWidget添加按钮
addAction添加QAction
3.状态栏
//状态栏
QStatusBar *Qsta=new QStatusBar();
//加入窗口
setStatusBar(Qsta);
//设置左侧提示
QLabel *x=new QLabel("恐怖屋");
Qsta->addWidget(x);
//设置右侧提示
QLabel *y=new QLabel("第三病栋");
Qsta->addPermanentWidget(y);
qt太多要记的了5555
4.浮动窗口
//floatWidget
QDockWidget *dock=new QDockWidget("show memory",this);
addDockWidget(Qt::TopDockWidgetArea,dock);
dock->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);
5.设置核心部件
//设置central widget(有且只有一个)
QTextEdit *textedit=new QTextEdit(this);
setCentralWidget(textedit);
6.总结
只有一个的用set,能有多个的是add
三。图形化学习
3.1.设置图标
1.设置icon的绝对路径
ui->setupUi(this);
ui->actionnew->setIcon(QIcon("D:\\QTimage\\zhangya.jpg"));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rgM0ZHu-1617466776760)(image-20201223221328068.png)]
2.设置icon的相对路径
添加文件夹到mainWindows的文件下,然后addnew QT resources,添加前缀,添加文件
有手就行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2BcF4yO-1617466776761)(image-20201223222355484.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZ8AR6tZ-1617466776762)(image-20201223223251227.png)]
新版只需要去图片那里复制路径即可
perfect
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akUrQTQw-1617466776763)(image-20201223223610985.png)]
3.2 对话框 (模态与非模态)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQFDsd0G-1617466776764)(image-20201223233707116.png)]
//阻塞的模态,非模态(可对其他窗口操作)
connect(ui->actionnew,& QAction::triggered,[=](){
// QDialog dia(this);
// dia.resize(200,200);
// dia.exec();
// qDebug()<<"dialog finished";
//非模态(可对其他窗口操作)
QDialog *dia2=new QDialog(this);
//这个如果不释放主窗口就不会释放,会不停的泄露内存
dia2->show();//只是闪一下
dia2->resize(200,200);
qDebug()<<"dialog finished";
});
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgpBnQuZ-1617466776765)(image-20201224000248780.png)]
//这个如果不释放主窗口就不会释放,会不停的泄露内存需要删除时候释放
dia2->setAttribute(Qt::WA_DeleteOnClose);//55号属性
3.3标准对话框(重点)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTHLdDPm-1617466776766)(image-20201224151059674.png)]
//标准对话框
// QMessageBox::critical(this,"critical","error404");
//参数一:父亲窗口,参数二:标题,参数三:提示内容 参数四 按键类型 参数五:默认关联回车按钮
QMessageBox::question(this,"请问要保存吗","该操作不可逆转",QMessageBox::Save |QMessageBox::Cancel,QMessageBox::Cancel );
//按下save保存
if(QMessageBox::Save==QMessageBox::question(this,"请问要保存吗","该操作不可逆转",QMessageBox::Save |QMessageBox::Cancel,QMessageBox::Cancel ))
{
qDebug()<<"save";
}
else {
qDebug()<<"cancel";
}
//颜色对话框
QColorDialog::getColor(QColor(255,0,0));
文件对话框
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPLEtmEO-1617466776767)(image-20201224153951175.png)]
字体对话框
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jdc7heUe-1617466776768)(image-20201224154253938.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1HNgr3K-1617466776769)(image-20201224154424246.png)]
图形化界面:弹簧,widget的栅栏布局,widget要选垂直策略 fixed
3.4 Toolbar实现早期qq的聊天好友
设置按钮默认选中
ui->sexbtnman->setChecked(true);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3qCrtpX-1617466776770)(image-20201224235043761.png)]
checkbox默认值
半选状态(tristate)
3.4QListWidget
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEgwb3rS-1617466776771)(image-20201225171203913.png)]
字符串方法
QStringList string;
string<<"aaa"<<"ksk";
ui->list->addItems(string);
3.4QTreeWidget
ui->tree->setHeaderLabels(QStringList()<<"ghost"<<"ability");
//父节点
QTreeWidgetItem *zy=new QTreeWidgetItem(QStringList()<<"张雅");
QTreeWidgetItem *zw=new QTreeWidgetItem(QStringList()<<"张雅");
QTreeWidgetItem *zi=new QTreeWidgetItem(QStringList()<<"张雅");
QTreeWidgetItem *zo=new QTreeWidgetItem(QStringList()<<"张雅");
//加入treewidget
ui->tree->addTopLevelItem(zy);
ui->tree->addTopLevelItem(zi);
ui->tree->addTopLevelItem(zw);
ui->tree->addTopLevelItem(zo);
//子节点的加入
QTreeWidgetItem *ch=new QTreeWidgetItem(QStringList()<<"张雅");
zy->addChild(ch);
3.5Qtablewidget
//表单窗体
ui->table->setColumnCount(3);
ui->table->setRowCount(3);
ui->table->setHorizontalHeaderLabels(QStringList()<<"ghost"<<"sex"<<"age");
QStringList ghost;
ghost<<"zy"<<"xy"<<"xx";
QStringList sex;
sex<<"xx"<<"xy"<<"xx";
QStringList age;
age<<"zy"<<"xy"<<"xx";
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++)
{
if(j==0)
ui->table->setItem(i,j,new QTableWidgetItem(ghost[i]));
else if(j==1)
ui->table->setItem(i,j,new QTableWidgetItem(sex[i]));
else
ui->table->setItem(i,j,new QTableWidgetItem(age[i]));
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZbfm0M0-1617466776772)(image-20201225182435210.png)]
3.6.。jpg和gif添加
//textlabal,jpg,添加
ui->pic->setPixmap(QPixmap(":/QTimage/tank.jpg"));
QMovie *mo=new QMovie(":/QTimage/sisi.gif");
//gif添加
ui->gif->setMovie(mo);
mo->start();
3.7自定义组件
设计师界面加好,然后主界面添加那个类然后提升为那个类
自己写函数实现功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bHSHdsKQ-1617466776773)(image-20201226004745735.png)]
qt的占位符号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LW5aycf0-1617466776773)(Lily_Screenshot_1608916724.png)]
还有个global是基于屏幕的x,y
左右键和滚轮的自定义函数
还有buttons的组合键位操作,,,不重要,用位操作实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxR5Tj9v-1617466776774)(image-20201226012422798.png)]
#include<QMouseEvent>
void myLabel::enterEvent( QEvent *event)
{
qDebug()<<"enter";
}
void myLabel::leaveEvent( QEvent *)
{
qDebug()<<"leave";
}
void myLabel::mouseMoveEvent( QMouseEvent *event)
{
QString str=QString("move to x :%1 y : %2 Global x: %3 y:%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());
qDebug()<<str;
}
//设置鼠标追踪
setMouseTracking(true);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHavrNFb-1617466776775)(image-20201226014355595.png)]
3.8TIMEevent
方法一:重写一个timerevent,然后在函数里面调用一下
void Widget::timerEvent(QTimerEvent *)
{
static int num=1;
ui->lablel2->setText(QString::number(num++));
}
if (ev->timerId()==id1){
static int num=1;
ui->lablel2->setText(QString::number(num++));
}
if (ev->timerId()==id2){
static int num2=1;
ui->label3->setText(QString::number(num2++));
}
方法二:Qtimer头文件加自己写connect
QTimer *timer=new QTimer(this);
timer->start(500);
connect(timer,&QTimer::timeout,[=](){
static int num8=1;
ui->label4->setText(QString::number(num8++));
});
//按钮暂停和开始
ui->btn->setText("stop");
connect(ui->btn,&QPushButton::clicked,[=](){
if(ui->btn->text()=="stop")
{
timer->stop();
ui->btn->setText("start");
}
else {
timer->start();
ui->btn->setText("stop");
}
});
3.9.拦截事件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FaxI6Sap-1617466776776)(image-20201228175326473.png)]
//1.给label安装事件过滤器
ui->label->installEventFilter(this);
//2.重写函数
//2.重写filter函数
bool eventFilter(QObject *,QEvent *);
bool Widget::eventFilter(QObject *obj,QEvent *e){
if(obj==ui->label)
{
if(e->type()==QEvent::MouseButtonPress)
{
QMouseEvent *ev= static_cast<QMouseEvent *>(e);
QString str=QString("XXXX") ;
qDebug()<<str;
return true;
}
}
return QWidget::eventFilter(obj,e);
}
4.Qpainter
1.导入画家类并且重写绘图事件PaintEvent
void Widget::paintEvent(QPaintEvent *){
//实例化一个painter对象,并把目标作为参数传进构造函数
QPainter p(this);
//钢笔
QPen pen(QColor(255,0,0));
pen.setWidth(3);
//设置画笔风格
pen.setStyle(Qt::DashLine);
p.setPen(pen);
//设置画刷
QBrush brush(QColor(0,255,255));
p.setBrush(brush);
//划线
p.drawLine(0,0,100,100);
//画圆(椭圆)
p.drawEllipse(QPoint(100,100),30,30);
//画矩形
p.drawRect(20,20,50,50);
}
2.高级设置
QPainter p(this);
p.drawEllipse(QPoint(50,50),50,50);
//设置抗锯齿能力
p.setRenderHint(QPainter::Antialiasing);
//设置画家的位置
p.translate(100,100);
//保存画家状态
p.save();
p.drawEllipse(QPoint(50,150),50,50);
//还原画家状态
p.restore();
3.导入图片操作
//用painter画出资源文件
QPainter q(this);
q.drawPixmap(poX,30,QPixmap(":/QTimage/zhangya.jpg"));
//按钮对图片进行移动
connect(ui->btn,&QPushButton::clicked,[=](){
poX+=20;
update();
});
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyU9CZg7-1617466776778)(image-20201228193858207.png)]
5.QPixmap
pixmap自带缩放的功能scaled
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0jkVPFN-1617466776778)(image-20201228194855447.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGNtUFIg-1617466776779)(image-20201228195121329.png)]
Qimage
//利用QImage 修改
QImage img;
img.load(":/QTimage/tank.jpg");
for (int i=40;i<100;i++) {
for (int j=40;j<100;j++) {
img.setPixel(i,j,QRgb(qRgb(200,200,200)));
}
}
q.drawImage(0,0,img);
Qpicture
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hA4XGP9d-1617466776780)(image-20201228201203025.png)]
5.Qfile读写
#include<QFileDialog>
connect(ui->pushButton,&QPushButton::clicked,[=](){
//获取路径
QString str= QFileDialog::getOpenFileName(this,"open file","D:\\QTimage");
//写入textedit
ui->lineEdit->setText(str);
//读取文件
QFile file(str);
//查文档
file.open(QIODevice::ReadOnly);
//读取utf-8字节码文件
QByteArray arr=file.readAll();
//写入文件
ui->textEdit->setText(arr);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KYyEWLa-1617466776781)(image-20201228204859002.png)]
//写操作
file.open(QIODevice::Append);
file.write("aaqaa");
file.close();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PxPiU8Wn-1617466776782)(image-20201228205649574.png)]
6.QFileInto
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nz3URSzJ-1617466776784)(image-20201228230857198.png)]
{
img.setPixel(i,j,QRgb(qRgb(200,200,200)));
}
}
q.drawImage(0,0,img);
### Qpicture
[外链图片转存中...(img-hA4XGP9d-1617466776780)]
## 5.Qfile读写
```cpp
#include<QFileDialog>
connect(ui->pushButton,&QPushButton::clicked,[=](){
//获取路径
QString str= QFileDialog::getOpenFileName(this,"open file","D:\\QTimage");
//写入textedit
ui->lineEdit->setText(str);
//读取文件
QFile file(str);
//查文档
file.open(QIODevice::ReadOnly);
//读取utf-8字节码文件
QByteArray arr=file.readAll();
//写入文件
ui->textEdit->setText(arr);
[外链图片转存中…(img-2KYyEWLa-1617466776781)]
//写操作
file.open(QIODevice::Append);
file.write("aaqaa");
file.close();
[外链图片转存中…(img-PxPiU8Wn-1617466776782)]
6.QFileInto
[外链图片转存中…(img-Nz3URSzJ-1617466776784)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8sQfErK-1617466776785)(image-20201228231107238.png)]