添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

个人学习笔记-QT

一、 C++::QT

1. Qt是一个跨平台的C++开发库,主要用来开发图形用户界面GUI(Graphical User Interface)程序,当然也可以开发不带界面的命令行CUI(Command User Interface)程序

2. Qt支持的操作系统有很多,例如通用操作系统Windows、Linux、Unix,智能手机系统Android、IOS、WinPhone,嵌入式系统QNX、VxWorks等等

3. 创建一个初始QT程序,认识QT程序

① 创建,选择项目路径(不能有中文)和项目名(不能有空格);

② 窗口类:Qwidget基类与Qmaindow、Qdialog两个派生类共三种;

③ 头文件#include <QWidget>;

④ 头文件#include <QMainWindow>;

⑤ 头文件#include <QApplication>;

⑥ 头文件#include <QDebug>;

⑦ QApplication a(argc,argv);//应用程序对象,有且仅有一个;

⑧ QWidget w;//实例化窗口对象;

⑨ w.show();//函数,显示窗口;

⑩ return a.exec();//让应用程序对象进入消息循环机制中,代码阻塞到当前行;

4. 按钮控件常用API

① 头文件#include <Qpushbutton>;

② 创建按钮QPushButton * btn = new QPushButton;

③ 设置按钮父亲对象btn->setParent(this);

④ 设置按钮文本btn->setText(“文字”);

⑤ 设置按钮位置btn->move(宽,高);

⑥ 重新指定按钮大小btn->resize(宽,高);

⑦ 设置按钮固定大小btn->setFixedSize(宽,高);

⑧ 设置窗口标题setWindowTitle(“文字”);

5. 对象树:当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,对象会放入到对象树中,一定程度上简化了内存回收机制

6. QT坐标系:以左上角为原点向外延伸

7. 信号和槽

① 连接函数connect(参数1,参数2,参数3,参数4);

参数1:信号的发送者;

参数2:发送的信号(函数地址);

参数3:信号的接受者;

参数4:处理的槽函数(函数的地址);

② 松散耦合,实现了一个点击按钮关闭窗口的案例:

connect(btn,&QPushButton::clicked,this,&QWidget::close);

8. 自定义信号和槽

① 自定义信号:

写到signals下;

返回void;

需要声明,不需要实现;

可以有参数可以重载;

② 自定义槽函数:

返回void;

需要声明,也需要实现;

可以有参数,可以重载;

写public slot下或者(5.5以后)public或者全局函数;

③ 触发自定义的信号:

emit自定义信号;

案例:下课后,老师触发饿了信号,学生响应信号,请客吃饭;

9. 自定义信号和槽出现重载

① 需要利用函数指针明确指向函数的地址;

void(Teacher::*teacherSignal)(QString)= &Teacher::hungry;

void(Student::*studentPublic)(QString)= &Student::treat;

② QString转成char*;

qDebug()<<"请老师吃88,老师吃:"<<foodName.toUtf8().data();

③ 信号可以连接信号;

一个信号可以连接多个槽函数;

多个信号可以连接同一个槽函数;

信号和槽函数的参数必须类型一一对应;

信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数;

④ 断开信号之间、信号和槽之间的连接;

disconnect(btn2,&QPushButton::clicked,Myl,teacherSignal2);

10. Lambda表达式

① [](){}();

[]标识符 匿名函数;

[=] 值传递;

[&] 引用传递;

()参数;

{} 实现体;

mutable修饰值传递变量,可以修改拷贝出的数据,改变不了本体;

返回值[]()->int{}();

② 作业:

QWidget* newShow = new QWidget;

newShow->resize(800,600);

QPushButton* btn1 = new MyPushButton;

QPushButton* btn2 = new MyPushButton;

QPushButton* btn3 = new QPushButton("close new windows",newShow);

btn1->setParent(this);

btn1->setText("open");

btn2->setParent(this);

btn2->move(100,0);

btn2->setText("close");

connect(btn1,&MyPushButton::clicked,newShow,[=](){

newShow->show();

connect(btn3,&QPushButton::clicked,newShow,&myWidget::close);

});

connect(btn2,&MyPushButton::clicked,this,&myWidget::close);

connect(btn2,&MyPushButton::clicked,newShow,&myWidget::close);

----------------------------------------------------------------------------------------------------------第一次课进度

11. QmainWindow

① 菜单栏(最多只能有一个)(上);

头文件#include <QMenuBar>;

QMenuBar * bar = new menuBar(this);//新建菜单栏;

setMenuBar(bar);//将菜单栏放到窗口中;

QMenu * fileMenu = bar->addMenu("file");//在窗口中为菜单栏创建菜单;

QAction * newAction = fileMenu->addAction("add new");//创建菜单项;

fileMenu->addSeparator();//添加分割线;

QAction * openAction = fileMenu->addAction("open now");//创建菜单项;

QMenu * editMenu = bar->addMenu("edit");//在窗口中为菜单栏创建菜单;

② 工具栏(可以有多个)(上下左右);

头文件#include <QToolBar>;

QToolBar * toolBar = new QToolBar(this);//创建工具栏;

addToolBar(Qt::BottomToolBarArea(默认停靠范围),toolBar);//将工具栏放到窗口中;

toolBar->addAction(newAction);//添加工具项;

toolBar->addSeparator();//添加分割线;

toolBar->addAction(openAction);//添加工具项;

//按钮覆盖工具栏选项;

③ 状态栏(最多只能有一个)(通常在下);

头文件#include <QStatusBar>;

头文件#include <QLabel>;

QStatusBar * stBar =new QstatusBar(this);//创建状态栏;

setStatusBar(stBar);//将状态栏放到窗口中;

QLabel * label = new QLabel("kill durg:",stBar);//设置状态项;

stBar->addWidget(label);//添加状态项;

QLabel * labe2 = new QLabel("system message:",stBar);//设置状态项;

stBar->addPermanentWidget(labe2);//添加状态项;

④ 铆接部件(可以有多个);

头文件#include <QDockWidget>;

QDockWidget * dockWidget = new QdockWidget(this);//设置浮动窗口;

addDockWidget(Qt::BottomDockWidgetArea,dockWidget);//将浮动窗口放到窗口中附带默认位置;

⑤ 设置核心部件(最多只能有一个);

头文件#include <QTextEdit>;

QTextEdit * edit = new QTextEdit(this);//创建核心部件;

setCentralWidget(edit);//将核心部件放到窗口中;

12. 资源文件添加

① 将图片文件拷贝到项目位置下;

② 右键项目->添加新文件–>Qt->Qt recourse File->给资源文件起名res;

③ res生成res.qrc;

④ open in editor编辑资源;

⑤ 添加前缀,添加文件;

⑥ 使用“:+前缀名+文件名”;

⑦ ui->actionNew->setIcon(QIcon("E:/Image/Luffy.png"));

⑧ 使用添加Qt资源“:+前缀名+文件名”;

⑨ ui->actionNew->setIcon(QIcon(":/Image/Luffy.png"));

⑩ ui->actionOpen->setIcon(QIcon(":/Image/LuffyQ.png"));

13. 对话框

头文件#include <QDialog>;

connect(ui->actionxinjian,&QAction::triggered,[=](){

① 模态对话框(阻塞);

QDialog dlg(this);

dlg.resize(200,100);

dlg.exec();

qDebug()<< "模态对话框弹出了";

② 非模态对话框(不阻塞);

QDialog * dlg1 = new QDialog(this);

dlg1->resize(200,100);

dlg1->show();

qDebug()<< "非模态对话框弹出了";

③ 消息对话框头文件#include <QMessageBox>;

//信息对话框;

QMessageBox::information(this,"info","信息");

//错误对话框;

QMessageBox::critical(this,"critical","错误");

//警告对话框;

QMessageBox::warning(this,"warning","警告");

//提问对话框;

//参数1 父亲 参数2 标题 参数3 提示内容 参数4 按键类型 参数5 默认关联回车按键;

if(QMessageBox::Save == QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel)){

qDebug()<< "选择的是保存";

}

else{

qDebug()<< "选择的是取消";

}

④ 颜色对话框头文件#include <QColorDialog>;

QColor color = QColorDialog::getColor(QColor(255,0,0));

qDebug()<< "r = " << color.red()<< " g = " << color.green()<< " b = " << color.blue();

⑤ 文件对话框头文件#include <QFileDialog>;

//参数1 父亲 参数2 标题 参数3 默认打开路径 参数4 过滤文件格式 返回值是 选取的路径;

QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop","(*.txt)");

qDebug()<< str;

⑥ 字体对话框头文件#include <QFontDialog>;

bool flag;

QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36));

qDebug()<< "字体:" << font.family().toUtf8().data()<< " 字号 "<< font.pointSize()<< " 是否加粗"<< font.bold()<< " 是否倾斜"<<font.italic();

14. 界面布局

水平布局、垂直布局、阵列布局、弹簧调整;

15. 控件

① 按钮控件;

PushButton,常用按钮;

ToolButton,工具按钮,用于显示图片,如图想显示文字,修改风格:toolButtonStyle,凸起风格autoRaise;

radioButton,单选按钮,设置默认ui->rBtnMan->setChecked(true);

checkbox,多选按钮,监听状态,0未选状态,1半选状态,2选中状态;

② ListWidget控件;

//利用listWidget赋值;

QListWidgetItem * item = new QListWidgetItem("锄禾日当午");

ui->listWidget->addItem(item);

//居中

item->setTextAlignment(Qt::AlignHCenter);

//利用QStringListQList<QString>方法赋值;

QStringList list;

list << "锄禾日当午" << "旱地和下土" << "谁知盘中餐"<< "粒粒皆辛苦";

ui->listWidget->addItems(list);

③ TreeWidget控件;

//设置水平头;

ui->treeWidget->setHeaderLabels(QStringList()<< "英雄"<< "英雄介绍"<< "英雄属性");

QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<< "力量");

//加载顶层的节点;

ui->treeWidget->addTopLevelItem(liItem);

//追加子节点;

QStringList heroL1;

heroL1 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成可观的范围输出"<<"坦克";

QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);

liItem->addChild(l1);

④ TableWidget控件;

//设置列数;

ui->tableWidget->setColumnCount(3);

//设置水平表头;

ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<< "性别"<< "年龄");

//设置行数;

ui->tableWidget->setRowCount(5);

//设置正文;

//单条插入数据,第零行,第零列;

//ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));

QStringList nameList;

nameList<< "亚瑟"<< "赵云"<< "张飞"<< "关羽" << "花木兰";

QList<QString> sexList;

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.at(i)));

//int 转 QString;

ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));

}

⑤ 其它控件;

//栈控件使用;

//设置默认定位 scrollArea;

ui->stackedWidget->setCurrentIndex(1);

//scrollArea按钮;

connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){

ui->stackedWidget->setCurrentIndex(1);

});

//toolBox按钮;

connect(ui->btn_ToolBox,&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("拖拉机");

//点击按钮 选中拖拉机选项;

connect(ui->btn_select,&QPushButton::clicked,[=](){

//ui->comboBox->setCurrentIndex(2);

ui->comboBox->setCurrentText("拖拉机");

});

//利用QLabel显示图片;

ui->lbl_Image->setPixmap(QPixmap(":/Image/butterfly.png"));

//利用QLabel显示gif动态图片;

QMovie * movie = new QMovie(":/Image/mario.gif");

ui->lbl_movie->setMovie(movie);

//播放动图;

头文件#include <Movie>;

movie->start();

----------------------------------------------------------------------------------------------------------第二次课进度

16. 自定义封装控件

① 添加新文件Qt设计师界面类(.h .cpp .ui);

② .ui中设计QSpinBox和QSlider两个控件;

③ Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,添加类,点击提升;

④ 实现功能,改变数字,滑动条跟着移动,信号槽监听;

⑤ 提供getNum和setNum对外接口;

⑥ 测试接口;

17. QT中的鼠标事件

① 鼠标进入事件void myLabel::enterEvent(QEvent *event);

② 鼠标离开事件void myLabel::leaveEvent(QEvent *);

③ 鼠标按下void myLabel::mousePressEvent(QMouseEvent *ev);

④ 鼠标释放void myLabel::mouseReleaseEvent(QMouseEvent *ev);

⑤ 鼠标移动void myLabel::mouseMoveEvent(QMouseEvent *ev);

⑥ QString str = QString("鼠标释放了x =%1 y=%2 globalX =%3 globalY =%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());

⑦ ev->button()可以判断所有按键Qt::LeftButton,Qt::MiddleButton,Qt::RightButton;

⑧ ev->buttons()判断组合按键(ev->buttons()&Qt::LeftButton),判断move时候的左右键,结合&操作符;

⑨ 格式化字符串 QString(“ %1 %2 ”).arg(111).arg(222);

⑩ 设置鼠标追踪setMouseTracking(true);

18. 定时器

① 利用事件;

利用事件void timerEvent QTimerEvent * ev);

启动定时器startTimer(1000)毫秒单位;

timerEvent的返回值是定时器的唯一标示,可以和ev->timerId做比较;

② 利用定时器类;

头文件#include <QTimer>;

创建定时器对象 QTimer * timer = new QTimer(this);

启动定时器timer->start(毫秒);

每隔一定毫秒,发送信号timeout,进行监听;

暂停timer->stop;

继续timer->start;

19. 事件分发器拦截

① 事件分发过程中做拦截操作,不建议使用;

② bool event(QEvent *e);

③ return true;返回值如果是true,代表用户处理这个事件,不向下分发;其他默认处理return QLabel::event(e);

④ e->type()== 判断事件是否向下分发;

20. 事件过滤器拦截

① 在程序将事件分发到事件分发器前,可以利用过滤器做拦截;

② 安装ui->label->installEventFilter(this);

③ 重写bool Widget::eventFilter(QObject * obj,QEvent * e);

④ return true;返回值如果是true,代表用户处理这个事件,不向下分发;

⑤ 其他默认处理return QWidget::eventFilter(obj,e);

21. 绘图事件

① 头文件#include <QPainter>;

//实例化画家对象this指定的是绘图设备;

QPainter painter(this);

② //设置画笔颜色;

QPen pen(QColor(255,0,0));

//设置画笔宽度;

pen.setWidth(3);

//设置画笔风格;

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),50,50);

//画矩形;

painter.drawRect(QRect(20,20,50,50));

//画文字;

painter.drawText(QRect(10,200,150,50),"好好学习,天天向上");

////////////////////////////高级设置////////////////////////////

//实例化画家对象this指定的是绘图设备;

QPainter painter(this);

painter.drawEllipse(QPoint(100,50),50,50);

//设置抗锯齿能力,效率较低;

painter.setRenderHint(QPainter::Antialiasing);

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));

////////////////////////////高级设置////////////////////////////

//实例化画家对象this指定的是绘图设备;

QPainter painter(this);

QPixmap pix = QPixmap(":/Image/Luffy.png");

//如果超出屏幕 从0开始;

if(posX >= this->width());

{

posX = -pix.width();

}

painter.drawPixmap(posX,0,pix);

22. 绘图设备

① QPixmap,QImage,QBitmap(黑白色),QPicture,QWidget;

② //Pixmap绘图设备,专门为平台做了显示的优化;

QPixmap pix(300,300);

//填充颜色;

pix.fill(Qt::white);

//声明画家;

QPainter painter(&pix);

painter.setPen(QPen(Qt::green));

painter.drawEllipse(QPoint(150,150),100,100);

//保存;

pix.save("E:\\pix.png");

③ QImage可以对像素进行访问;

QImage img(300,300,QImage::Format_RGB32);

img.fill(Qt::white);

QPainter painter(&img);

painter.setPen(QPen(Qt::blue));

painter.drawEllipse(QPoint(150,150),100,100);

//保存;

img.save("E:\\img.png");

④ QPicture记录和重现,绘图指令;

QPicture pic;

QPainter painter;

painter.begin(&pic);//开始往pic上画;

painter.setPen(QPen(Qt::cyan));

painter.drawEllipse(QPoint(150,150),100,100);

painter.end();//结束画画;

//保存到磁盘;

pic.save("E:\\pic.zt");

23. QFile文件读写操作

① 头文件#include <QFile>;对文件进行读写操作;

② 读;

//设置完ui后,点击选取文件按钮,弹出文件对话框;

connect(ui->pushButton,&QPushButton::clicked,[=](){

QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop");

//将路径放入到lineEdit中;

ui->lineEdit->setText(path);

//编码格式类;

//QTextCodec * codec = QTextCodec::codecForName("gbk");

//读取内容 放入到textEdit中;

//QFile默认支持的格式是utf-8;

QFile file(path);//参数就是读取文件的路径;

//设置打开方式;

file.open(QIODevice::ReadOnly);

//QByteArray array = file.readAll();

QByteArray array;

while !file.atEnd())

{

array += file.readLine();//按行读;

}

//将读取到的数据放入textEdit中;

ui->textEdit->setText(array);

//ui->textEdit->setText codec->toUnicode(array));

//对文件对象进行关闭;

file.close();

③ 写;

file.open(QIODevice::Append);//用追加方式进行写;

file.write("啊啊啊啊啊");

file.close();

④ QFileInfo读取文件信息;

QFileInfo info(路径);

qDebug()<<"大小:"<<info.size()<<"后缀名:"<<info.suffix()<<"文件名称:"<<info.fileName()<<"文件路径:"<<info.filePath();

qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");

qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

----------------------------------------------------------------------------------------------------------第三次课进度

发布于 2023-03-05 16:35 ・IP 属地北京