QT
1.qt快捷键
注释 ctrl+/
查找 ctrl+f
整行移动 ctrl+shift +↑或↓
自动对齐 ctrl+i
同名之间.h和.cpp切换 F4
2.QPushButton控件
show以顶层方式弹出窗口
创建按钮 QPushnButton *btn = new QPushButton(“第一个按钮”,this);
设置父类 (依靠) setParent(this)
设置文本 setText(“文字”)
设置按钮位置 btn.move(宽,高)
重新指定窗口大小且不可改变 setFixedSize(宽,高)
设置窗口标题 setWindowTitle(“标题”)
3.对象树
当创建的对象在堆区(即使用new)的时候,如果指定的父亲时QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放操作,对象会被放进对象树中
一定程度上简化了内存回收机制
4.窗口坐标体系
左上角为(0,0)点
x以右为正方向
y以下为正方向
5.信号和槽
connect(信号的发送者,发送的信号(函数地址),信号的接收者,处理的槽函数(函数地址))
松散耦合
connect(mybtn,&MyQPushButton::clicked,this,&MyWidget::close)
或
connect(mybtn,&QPushButton::clicked,this,&QWidget::close)
自定义信号
写到signals下
返回值为void
需要声明 不需要实现
可以有参数 可以重载
自定义槽函数
返回void
需要声明 也需要实现
可以有参数 可以重载
写到public slot下 或者 public 或者全局函数
触发自定义的信号
emit自定义信号
当自定义信号和槽出现重载
1.需要利用函数指针 明确指向函数的地址
2.void(Teacher::tSignal)(QString)=&Teacher::hungry;
3.QString 转化成 char
.ToUtf8() 转化为 QByteArray
.Data() 转化为 char*
4.信号可以连接信号
5.断开信号 disconnect
一个信号可以连接多个槽函数
多个信号可以连接同一个槽函数
信号和槽函数的参数必须类型一一对应
信号的参数个数可以多于槽函数的参数个数
6.lambda表达式
[=](){}
= 值传递
& 引用传递
() 参数
{} 实现体
mutable 修饰 值传递变量,可以修改拷贝出的数据,修改不了本体
7.QMainWindow
菜单栏 最多只有一个
QMenu *bar = MenuBar();
setMenuBar(bar); //this->setMenuBar(bar);
Qmenu * fileMenu = bar->addMenu("文件");//创建菜单
QAction *newAction = fileMenu->addAction("新建");//创建菜单项
可以添加分割线 fileMenu->addSeparator();
工具栏 可以有多个
QToolBar *toolbar = new QToolBar(this);
addToolBar(默认停靠区域,toolbar); Qt::LeftToolBarArea
设置后期停靠区域 设置浮动 设置移动
//后期设置为只能左右区域停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置为不允许浮动
toolBar->setFloatable(false);
//设置是否可以移动
toolBar->setMovable(true);//总控制添加菜单项 或者添加小控件
一个用set 多个用add
状态栏 最多一个
QStatusBar * stBar = statusBar();
设置到窗口中 setStatusBar(stBar);
stBar->addWidget(label);放左侧信息
stBar->addPermanentWidget(label2); 放右侧信息
铆接部件 浮动窗口 可以多个
QDockWidget
addDockWidget( 默认停靠区域,浮动窗口指针)
设置后期停靠区域
设置核心部件 只能一个
setCentralWidget(edit);
8.资源文件
将图片文件 拷贝到项目位置下
右键项目->添加新文件 –> Qt - > Qt recourse File - >给资源文件起名
res 生成 res.qrc
open in editor 编辑资源
添加前缀 添加文件
使用 “ : + 前缀名 + 文件名 ”
9.对话框
模态对话框
不可以对其他窗口进行操作 阻塞
QDialog dlg(this)
dlg.exec();//阻塞效果 完成后执行下一步
非模态对话框
可以对其他窗口进行操作
防止一闪而过 创建到堆区
QDialog *dlg2 = new QDialog(this);//无限创建时,堆区上的内容没有释放,可能导致内存泄露
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 属性 关掉时,释放对象
注意:如果提示警告,有可能是弹出的窗口太小,重新设置窗口大小后可消除
10.消息对话框
标准对话框:消息对话框
QMessageBox 静态成员函数 创建对话框
返回值也是StandardButton类型,利用返回值判断用户输入
错误对话框
QMessageBox::critical(this,"critical","错误");
信息对话框
QMessageBox::information(this,"info","信息");
提问对话框
参数1 父亲 参数2 标题 参数3 显示内容 参数4 按键类型 参数5 默认关联回车按键
if(QMessageBox::save == QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel)){
qDebug()<<"选择的是保存";
}else{
qDebug()<<"选择的是取消";
}
警告对话框
QMessageBox::warning(this,"warning","警告");
11.其他对话框(简略版)
颜色对话框 QColorDialog::getColor
QColor color=QColorDialog::getColor(QColor(255,0,0));
qDebug()<<"red: "<<color.red()<<" green: "<<color.green()<<" blue: "<<color.blue();
文件对话框 QFileDialog::getOpenFileName
//文件对话框 参数1 父亲 参数2 标题 参数3 默认打开路径 参数4 过滤文件格式
//返回值时选取文件的路径
QString str = QFileDialog::getOpenFileName(this,"打开文件","D:\\桌面","(*.txt)");
qDebug()<<str;
字体对话框 QFontDialog::getFont
//字体对话框
bool flag;
QFont font=QFontDialog::getFont(&flag,QFont(“华文楷体”,32));
qDebug()<<“字体:”<<font.family().toUtf8().data()<<" 字号:“<<font.pointSize()<<” 是否加粗:“<<font.bold()<<” 是否倾斜:"<<font.italic();
12.QTreeWidget控件
//设置头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
//创建根节点
QTreeWidgetItem *item=new QTreeWidgetItem(QStringList()<<"力量");//利用匿名对象(此处为List<string>对象),匿名对象的生存周期当使用完这个对象后就释放
//添加根节点到树控件上
ui->treeWidget->addTopLevelItem(item);
//创建子节点的方法与创建根节点相同
QTreeWidgetItem *it1=new QTreeWidgetItem(list);
//添加子节点到根节点上
item->addChild(it1);
13.QTableWidget控件
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置竖直表头
ui->tableWidget->setVerticalHeaderLabels(QStringList()<<"1"<<"2"<<"3"<<"4"<<"5");
//设置正文
QList<QString> NameList;
NameList<<"曹操"<<"刘备"<<"张飞"<<"关羽"<<"小乔";
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(NameList[i]));
注意:QString转int类型可使用 QString::number(数值);
14.自定义控件封装
添加新文件 - Qt -设计师界面类 (.h .cpp .ui)
当函数有重载时可以使用函数指针找到要使用的函数
void(QSpinBox::* valuech)(int)=&QSpinBox::valueChanged;
connect(ui->spinBox,valuech,ui->horizontalSlider,&QSlider::setValue);
15.Qt中的鼠标事件
鼠标进入事件 enterEvent()
鼠标离开时间 leaveEvent()
鼠标按下 mousePressEvent(QMouseEvent *ev) ev会返回坐标 ev->x() x坐标 ev->y() y坐标
鼠标释放 mouseReleaseEvent()
鼠标移动 mouseMoveEvent()
ev->button() 可以判断所有的按键 Qt::LeftButton Qt::RightButton
ev->Buttons() 可以判断组合按键 判断move的时候的左右键 结合 & 操作符
格式化字符串 QString(" %1 %2 ").arg(111).arg(222);
16.计数器
计时器1
利用事件 void timerEvent(QTimeEvent * ev)
启动定时器 startTimer(1000) 单位:毫秒
TimerEvent 的返回值是定时器的唯一标识 可以和ev->timerId()做比较 以此来确定执行哪一个计时器
定时器2
利用定时器类 Qtimer
创建定时器对象 QTimer *timer = new QTimer(this)
启动定时器 timer->start(1000) 单位:毫秒
每隔一定的时间,发送信号 timeout 进行监听
17.event事件分发器
用途:用于事件的分发 也可用于做拦截操作(不建议)
bool event(QEvent *e)
返回值 如果是true 代表用户处理这个事件,就不向下分发了
e->type()==鼠标按下
18.eventFilter事件过滤器
在程序将事件分发到事件分发器前,可以利用过滤器做拦截
步骤:1.给空间安装事件过滤器 ui->label1->installEventFilter(this);
2.重写eventFilter函数(obj,ev) bool Widget::eventFilter(QObject *obj,QEvent *e);
19.QPainter绘图
绘图事件 void painEvent(QEvent *)
声明一个画家对象 QPainter painter(this) this 指绘图设备
画线、画图、画矩形、画文字
设置画笔 QPen pen 设置画笔宽度风格 pen.setStyle()
设置画刷QBrush brush 设置画刷 painter.setBrush(brush) 风格 brush.setStyle()
20.QPainter高级设置
抗锯齿 效率较低
painter.setRenderHint(QPainter::Antialiasing)
对画家进行移动
painter.translate(100,0);
保存状态 painter.save();
还原状态 painter.restore();
手动调用绘图事件 update()
利用画家画图片 painter.drawPixmap(x,y,QPixmap("图片路径"))
21.绘图设备
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("D:\\pix.png");
QImage 绘图设备 可以对像素访问
QImage image(300,300,QImage::Format_RGB32);
image.fill(Qt::blue);
//声明画家
QPainter painter(&image);
painter.setPen(QPen(Qt::green));
painter.drawEllipse(QPoint(150,150),100,100);
image.save("D:\\image.png");//保存到磁盘
QPicture 绘图设备 可以记录和重现绘图指令
QPicture pic;
QPainter painter;
painter.begin(&pic);
painter.setPen(QPen(Qt::red));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end();
pic.save("D:\\pic.zt");//这里的zt可以为任意后缀名
利用画图事件重现绘图指令
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
QPicture pic;
pic.load("D:\\pic.zt");
painter.drawPicture(0,0,pic);
}
22.文件操作
QString path=QFileDialog::getOpenFileName(this,"打开文件","D:\\Desktop");
//将路径放入lineText中
ui->lineEdit->setText(path);
//编码格式类
//QTextCodec * codec = QTextCode::codecForName("gbk");
//读取内容 放入到textEdit中
//QFile的默认格式是utf-8
QFile file(path);//参数就是读取文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray array=file.readAll();
//将读取到的数据 放入textEdit中
ui->textEdit->setText(array);
//ui->textEdit->setText(codec->toUnicode(array));
//对文件对象进行关闭
file.close();
//进行写文件
file.open(QIODevice::Append);//用追加方式写文件
file.write("aaaaa");
file.close();
QFileInfo 文件信息类
QFileInfo info(path);
qDebug()<<"大小:"<<info.size()<<" 后缀名:"<<info.suffix()<<" 文件名:"<<info.fileName();
qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");
qDebug()<<"最后的修改日期:"<<info.lastModified().toString("yyyy/MM/dd hh:mm:ss");