个人学习笔记-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");
----------------------------------------------------------------------------------------------------------第三次课进度