class information
父类:QWidget 创建空窗口
子类:QMainWindow 带菜单栏、工具栏、状态栏
QDialog 对话框
头文件
#include<QPushButton> //按钮控件的头文件
#include <QDebug> //print
#include<QPushButton> //按钮
#include<QMenuBar> //菜单
#include<QToolBar> //工具
#include<QLabel> //标签
#include<QStatusBar> //状态
#include<QDockWidget> //铆接部件
#include<QTextEdit> //文本编辑
//对话框
#include<QDialog>
#include<QMessageBox>
#include<QColorDialog>
#include<QFileDialog>
#include<QFontDialog>
#include<QMovie>
#include<QTimer> //定时器类
//文件操作
#include <QFileDialog>
#include <QFile>
#include <QTextCodec>
#include <QFileInfo>
main函数
#include "mywidget.h"
#include <QApplication>//应用程序的类的头文件
int main(int argc, char *argv[])
{
//应用程序对象,在qt中,有且只有一个a
QApplication a(argc, argv);
//窗口对象,父类是QWeight
myWidget w;
//窗口对象默认不会显示,必须要调用show方法显示窗口
w.show();
//让应用程序对象进入消息循环
//让代码阻塞到这一行
return a.exec();
}
.pro文件
QT += core gui //qt包含的模块:核心模块 图形模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本以上,包含widget模块
CONFIG += c++17 //使用C++17标准
//如果取消注释,它会在编译时定义QT_DISABLE_DEPRECATED_BEFORE宏,并将其值设置为0x060000(即Qt 6.0.0的版本号)。这样做会导致所有在Qt 6.0.0之前被标记为弃用的API在编译时引发错误,从而帮助开发者确保他们的代码不会使用任何即将被移除的功能。
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mywidget.cpp
HEADERS += \
mywidget.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
//部署规则,即编译后的可执行文件应该被放置在哪个目录下。这取决于目标平台和操作系统。例如,对于QNX系统,可执行文件将被放置在/tmp/$${TARGET}/bin目录下($${TARGET}是一个变量,代表项目目标的名字)。对于非Android的Unix系统,可执行文件将被放置在/opt/$${TARGET}/bin目录下。如果这些目录不为空,那么还会将目标文件添加到安装列表中,以便在构建过程中进行安装。
命名规范
类名 首字母大写,单词间首字母大写
函数名 变量名 首字母小写,单词间首字母大写
快捷键
运行 ctrl r
编译 ctrl b
查找 ctrl f
帮助文档 F1
自动对齐 ctrl i
同名.h .cpp切换 F4
帮助文档
“C:\Qt\5.15.0\mingw81_32\bin\assistant.exe”
按钮控件常用API
创建按钮控件 QPushButton * btn2=new QPushButton;
设置依赖为当前窗口 setParent(this);
设置文本 setText(" ")
设置位置 move(width,high)
重新指定窗口大小 resize
设置窗口标题 setWindowTitle
设置窗口固定大小 setFixed
对象树
当创建的对象在堆区的时候,如果指定的父亲是QObject或其子类派生出的类,可以不用管理释放的操作,将对象会放入到对象树中。
一定程度上简化了内存回收机制。
在析构函数调用时,先执行父类析构函数内操作,再检查是否有子类,执行子类析构函数内操作,再继续查找其子类。之后再从最子类逐步析构至父类。
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{}
myWidget::~myWidget() {
qDebug()<<"mywidget 析构";
}
myPushbutton::myPushbutton(QWidget *parent)
: QPushButton{parent}
{
qDebug()<<"mypushbutton 构造";
}
myPushbutton::~myPushbutton(){
qDebug()<<"mypushbutton 析构";
}
//程序输出:mypushbutton 构造
// mywidget 析构
// mypushbutton 析构
窗口坐标体系
左上角为(0,0),x向右增加,y向下增加。
信号和槽
连接函数 connect
参数(信号发送者,发送信号(函数地址),信号接收者,槽函数(函数地址))
特点:松散耦合
//点击mypushbutton关闭窗口
connect(mybtn,&myPushbutton::clicked,this,&myPushbutton::close);//指向成员函数的指针
connect(mybtn,&QPushbutton::clicked,this,&QPushbutton::close); //等价
signals 信号
clicked(bool clicked=false) 点击
pressed() 按下
released() 松开
toggled(bool clicked) 切换
slots槽
closs()关闭
自定义信号和槽
自定义信号
- 写到signals下;
- 返回void;
- 需要声明,不需要实现;
- 可以有参数,可以重载
自定义槽函数
- 返回void;
- 需要声明,也需要实现;
- 可以有参数,可以重载;
- 写到public slit下或public或全局函数
触发自定义的信号
emit 自定义信号
自定义信号和槽出现重载
需要利用函数指针 明确指向函数的地址
void(teacher::*teacherdignal)(QString)=&teacher::hungry;
void(student::*studentslot)(QString)=&student::treat;
connect(tea,teacherdignal,stu,studentslot);
QString转成char*
void student::treat(QString food){
qDebug()<<"treat"<<food.toUtf8().data();
//qstring带引号,先转成QByteArray,再转成char*(看QByteArray中的方法)
}
信号连接信号
void(teacher::*dignal)(void)=&teacher::hungry;
void(student::*slot)(void)=&student::treat;
connect(tea,dignal,stu,slot);
classIsOver();
//点击按钮,触发下课
QPushButton* btn=new QPushButton("下课",this);
this->resize(600,400);
//信号连接信号
connect(btn,&QPushButton::clicked,tea,dignal);
断开信号
disconnect(btn,&QPushButton::clicked,tea,dignal);
总结
- 信号可以连接信号
- 一个信号可以连接多个槽函数
- 多个信号可以连接同一个槽函数
- 信号和槽函数的参数必须类型一一对应
- 信号和槽的参数个数不一定要一致,信号的参数个数可以多于槽函数的个数
qt4版本以前信号和槽的连接方式
connect(tea,SIGNAL(hungry(QString)), stu, SLOT(treat(QString)) );
- 优点:参数直观
- 缺点:类型不做检测
Lambda表达式
[]标识符 匿名函数
-
= 传递值
-
& 传递引用
[=](){ btn->setText("aaa"); }(); }
() 参数
{} 实现体
mutable 修饰 值传递变量,可以修改拷贝出的数据,改变不了本体
QPushButton* myBtn=new QPushButton(this);
QPushButton* myBtn2=new QPushButton(this);
myBtn2->move(100,100);
int m=10;
connect(myBtn,&QPushButton::clicked,this,[m]()mutable{m=100+10; qDebug()<<m;});
connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug()<<m;});
qDebug()<<m;
}
//输出
//10
//点击mybtn——110
//点击mubtn2——10
QPushButton*btn3=new QPushButton;
btn3->setText("关闭");
btn3->move(100,0);
btn3->setParent(this);
connect(btn3,&QPushButton::clicked,this,[=](){
this->close();
emit tea->hungry("rice");
});
利用Lambda表达式,可以实现含参数信号与clicked的连接,同时能进行更多操作
QMainWindow
菜单栏
//菜单栏只能有一个
//菜单栏创建
QMenuBar * bar=menuBar();
//将菜单放进窗口中
setMenuBar(bar);
//创建菜单
QMenu * filemenu =bar->addMenu("文件");
QMenu * editmunu=bar->addMenu("编辑");
//创建菜单项
QAction* newaction=filemenu->addAction("新建");
//添加分隔符
filemenu->addSeparator();
QAction* openaction=filemenu->addAction("打开");
工具栏
//工具栏可以有多个
QToolBar * toolBar=new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);
//只允许左右停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置浮动
toolBar->setFloatable(false);
//设置移动,总开关
toolBar->setMovable(false);
//工具栏中设置内容
toolBar->addAction(newaction); //和菜单栏项共用
toolBar->addSeparator();
toolBar->addAction(openaction);
//工具栏添加控件
QPushButton* btn =new QPushButton("aa",this);
toolBar->addWidget(btn);
状态栏
//状态栏 最多一个
QStatusBar* stbar =statusBar();
//设置到窗口
setStatusBar(stbar);
//放标签控件
QLabel *label=new QLabel("提示信息",this);
stbar->addWidget(label);
QLabel *label2=new QLabel("右侧提示信息",this);
stbar->addPermanentWidget(label2);
铆接部件
//铆接部件(浮动窗口),可以有多个
QDockWidget* dock=new QDockWidget("浮动",this);
//固定默认位置
addDockWidget(Qt::BottomDockWidgetArea,dock);
//设置后期停靠区域,只允许上下
dock->setAllowedAreas(Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea);
中心部件
//设置核心部件
QTextEdit* edit =new QTextEdit(this);
setCentralWidget(edit);
资源文件
- 将图片文件拷贝到项目文件下
- 创建新文件:右键项目——添加qt——qtresourcefile
- 生成.qrc
- 打开:open in editor 编辑资源
- 添加前缀——添加文件
- 使用:”:+前缀+文件名
ui->setupUi(this);
//添加qt资源
ui->actionnew->setIcon(QIcon(":/img/1F929.png"));
ui->actionopen->setIcon((QIcon(":/img/1F970.png")));
对话框
模态:不可以对其他窗口进行操作
非模态:可以对其他窗口进行操作
//点击新建按钮,弹出一个模态对话框(阻塞)
connect(ui->actionnew,&QAction::triggered,this,[=](){
QDialog dlg(this); //创建模态对话框
dlg.resize(200,100); //重置大小
dlg.exec(); //阻塞
qDebug()<<"模态对话框";
});
//点击打开按钮,弹出非模态对话框
connect(ui->actionopen,&QAction::triggered,this,[=](){
// QDialog dlg(this); (错误)若存放在栈中,show函数调用完成后未阻塞,变量释放,窗口一闪而过
QDialog*dlg2=new QDialog(this); //用new开辟空间存放在堆中
dlg2->resize(200,100);
dlg2->show(); //非阻塞对话框用show()显示
dlg2->setAttribute(Qt::WA_DeleteOnClose); //属性设置,55号,在关闭对话框时delete空间,防止多次点击关闭小窗口造成内存泄漏(默认在关闭大窗口时才会delete对象树中对象)
qDebug()<<"非模态对话框";
});
标准对话框
消息对话框
QMessageBox静态成员函数
错误、信息、提问、警告
//消息对话框
connect(ui->actiontool,&QAction::triggered,this,[=](){
//错误对话框
QMessageBox::critical(this,"critical","错误");
//信息对话框
QMessageBox::information(this,"info","信息");
//提问对话框
if(QMessageBox::Save==QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel)){
qDebug()<<"保存";
}
else{
qDebug()<<"取消";
}
//警告对话框
QMessageBox::warning(this,"warn","警告");
});
QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel)
//参数(父亲,标题,显示内容,按键名,默认回车悬停位置)
//返回值 StandarButton
其他对话框
//其他对话框
connect(ui->actiontool,&QAction::triggered,this,[=](){
//颜色对话框
QColor color=QColorDialog::getColor(QColor(255,0,0));
qDebug()<<color.red()<<color.green()<<color.blue();
//文件对话框
QStringList str=QFileDialog::getOpenFileNames(this,"打开文件","D:\\desktop","(*.txt)");
qDebug()<<str;
//字体对话框
bool flag;
QFont font= QFontDialog::getFont(&flag,QFont("华文彩云",36));
qDebug()<<font.family().toUtf8().data()<<font.pointSize()<<font.bold()<<font.italic();
//字体 字号 加粗 倾斜
});
控件
按钮
QListWidget列表容器
//利用listwidget写诗
QListWidgetItem * item=new QListWidgetItem("锄禾日当午");
ui->listWidget->addItem(item);
item->setTextAlignment(Qt::AlignCenter);//水平居中
QStringList list;
list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
ui->listWidget->addItems(list);
QTreeWidget树控件
//treewidget树控件使用
//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄简介");
//创建根节点
QTreeWidgetItem *liitem=new QTreeWidgetItem(QStringList()<<"力量");
QTreeWidgetItem *minitem=new QTreeWidgetItem(QStringList()<<"敏捷");
QTreeWidgetItem *zheitem=new QTreeWidgetItem(QStringList()<<"智力");
//加载根节点到树控件上
ui->treeWidget->addTopLevelItem(liitem);
ui->treeWidget->addTopLevelItem(minitem);
ui->treeWidget->addTopLevelItem(zheitem);
//追加子节点
QTreeWidgetItem *l1=new QTreeWidgetItem(QStringList()<<"小兰"<<"哈哈哈");
QTreeWidgetItem *l2=new QTreeWidgetItem(QStringList()<<"小许"<<"啧啧啧");
QTreeWidgetItem *l3=new QTreeWidgetItem(QStringList()<<"小黄"<<"嗯嗯嗯");
liitem->addChild(l1);
liitem->addChild(l2);
liitem->addChild(l3);
QTableWidget表格控件
//tablewidget控件
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
// ui->tableWidget->setItem(0,0,new QTableWidgetItem("小陈"));
QStringList namelist;
namelist<<"小陈"<<"小赵"<<"小柳"<<"小兰"<<"小许";
QStringList 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(0);
//scrollarea按钮 滚动条
connect(ui->scroll,&QPushButton::clicked,this,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
//toolbox按钮 包含选项
connect(ui->tool,&QPushButton::clicked,this,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
//tabwidget按钮 网页切换
connect(ui->tab1,&QPushButton::clicked,this,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
下拉框
//下拉框
ui->comboBox->addItem("小兰");
ui->comboBox->addItem("小黄");
ui->comboBox->addItem("小许");
//点击按钮 选中小黄
connect(ui->huang,&QPushButton::clicked,this,[=](){
// ui->comboBox->setCurrentIndex(1);
ui->comboBox->setCurrentText("小黄");
});
qlabel显示图片
//利用qlabel显示图片
ui->labelpic->setPixmap(QPixmap(":/img/1F929.png"));
//利用qlabel显示gif动态图片
QMovie* mov=new QMovie(":/img/aigei_com.gif");
ui->labelmov->setMovie(mov);
//播放动图
mov->start();
自定义控件封装
- 添加新文件:qt——qt widgets designer form class——widget
- .ui中设计控件,自定义封装
- widget中使用自定义控件:拖拽一个widget——提升为——添加自定义控件
smallwidget.cpp//控件cpp
#include "smallwidget.h"
#include "ui_smallwidget.h"
Smallwidget::Smallwidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Smallwidget)
{
ui->setupUi(this);
//QSpinBox移动,QSlider跟着移动
void(QSpinBox::* spSignal)(int)=&QSpinBox::valueChanged; //版本有重载,需要使用函数指针
connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);
//QSlider移动,QSpinBox跟着移动
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
}
//设置数字
void Smallwidget::setnum(int num){
ui->spinBox->setValue(num);
}
//获取数字
int Smallwidget::getnum(){
return ui->spinBox->value();
}
Smallwidget::~Smallwidget()
{
delete ui;
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击按钮,获取当前控件值
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
qDebug()<<ui->widget-> getnum();
});
connect(ui->pushButton2,&QPushButton::clicked,this,[=](){
ui->widget->setnum(50);
});
}
Widget::~Widget()
{
delete ui;
}
提升
在Qt中,“提升”(Promotion)是一个将Qt Designer中的某个标准控件提升(或转换)为用户自定义控件的过程。这一操作通常用于在Qt Designer中直接使用复杂的自定义控件,而无需在代码中手动替换。
QT事件
鼠标事件
- 鼠标进入
- 鼠标离开
- 鼠标移动
- 鼠标按下
- 鼠标释放
mylabel::mylabel(QWidget *parent)
: QLabel{parent}
{
setMouseTracking(true);//设置鼠标追踪状态
}
//鼠标进入事件
void mylabel::enterEvent(QEvent* event){
//qDebug()<<"enter";
}
//鼠标离开
void mylabel::leaveEvent(QEvent* event){
//qDebug()<<"leave";
}
//鼠标按下
void mylabel::mousePressEvent(QMouseEvent* ev){
qDebug()<<"press"<<ev->x()<<ev->y();
//字符串格式化,适合将变量值嵌入到字符串模板中
//x,y是相对坐标;globalx,globaly是以全局屏幕为参考的绝对坐标
if(ev->button() == Qt::LeftButton)
{
QString str=QString("x=%1,y=%2,globalx=%3,globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent* ev){
qDebug()<<"release";
}
//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent* ev){
//buttons()判断联合按键
if(ev->buttons() & Qt::LeftButton){ //&左键按下即执行 ==只有左键按下才执行
QString str=QString("x=%1,y=%2,globalx=%3,globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
定时器
利用事件TimerEvent
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//重写定时器事件
void timerEvent(QTimerEvent *)override;//override是一个关键字,它用于指示一个成员函数(方法)是用来重写(或称为覆盖)基类中的虚成员函数
//在类中申明标识,提升了id的访问,使它在成员函数中可见
int id1;//定时器1的唯一标识
int id2;//定时器2的唯一标识
private:
Ui::Widget *ui;
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//启动定时器
id1=startTimer(1000); //参数1 间隔
id2=startTimer(2000);
}
//重写定时器事件
//在Qt中,当你通过QWidget(或其子类)的startTimer(int interval)方法启动一个定时器时,Qt的事件循环会每隔指定的interval毫秒(以毫秒为单位)向该对象发送一个定时器事件(QTimerEvent)。这个定时器事件随后会触发对象中的timerEvent(QTimerEvent *event)函数的调用,前提是这个函数在类中已经被适当地重写(override)
void Widget::timerEvent(QTimerEvent * ev){
if(ev->timerId()==id1)
{
static int num1=1;
ui->label_2->setText(QString::number(num1++));
}
if(ev->timerId()==id2)
{
static int num2=1;
ui->label_3->setText(QString::number(num2++));
}
}
定时器类
//定时器第二种方式
QTimer *timer = new QTimer(this);
//启动定时器
timer->start(500);
connect(timer,&QTimer::timeout,this,[=](){
static int num1=1;
ui->label_4->setText(QString::number(num1++));
});
//点击暂停按钮,停止定时器
connect(ui->btn,&QPushButton::clicked,this,[=](){
timer->stop();
})
event事件
用途:事件分发,也可以做拦截操作(不建议)
//事件分发器拦截
bool mylabel::event(QEvent *e){
//如果鼠标按下,在event事件分发中做拦截操作
if(e->type()==QEvent::MouseButtonPress){
QMouseEvent* ev=static_cast<QMouseEvent>(e);//强制类型转换为子类
QString str=QString("在ev函数中,鼠标按下x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;//返回true代表用户自己处理这个事件,不向下分发
}
return QLabel::event(e);//其他事件 交给父类处理,默认处理
}
e->type() 用于判断枚举是什么事件
事件过滤器
在程序将事件分发到事件分发器之前,可以用过滤器做拦截。
//安装事件过滤器
ui->label->installEventFilter(this);
//定义事件过滤器
bool Widget::eventFilter(QObject *watched, QEvent *event){
if(watched==ui->label){ //判断框架
if((event->type())==QEvent::MouseButtonPress){ //判断事件
QMouseEvent* ev=static_cast<QMouseEvent*>(event);//强制类型转换为子类
QString str=QString("在过滤器函数中,鼠标按下x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;//返回true代表用户自己处理这个事件,不向下分发
}
}
return QWidget::eventFilter(watched,event);
QPainter
//绘图事件
void paintEvent(QPaintEvent *event);
void Widget::paintEvent(QPaintEvent *){
//实例化画家对象
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));
//设置风格
brush.setStyle(Qt::Dense7Pattern);
//使用画刷
painter.setBrush(brush);
//画线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆 椭圆
painter.drawEllipse(QPoint(100,100),100,50);
//画矩形
painter.drawRect(QRect(20,20,50,50));
//画文字
painter.drawText(QRect(10,200,100,50),"嗯嗯嗯");
}
高级设置
//高级设置
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);//让画家移动了100,0
//保存画家状态
painter.save();
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);
//还原保存状态
painter.restore();
painter.drawRect(QRect(20,20,50,50));static
手动调用绘图事件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击移动按钮,移动图片
connect(ui->pushButton,QPushButton::clicked,this,[=](){
posX+=20;
if(posX>this->width()){
posX=0;
}
//如果要手动调用绘图事件,用update
update();
});
}
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
//利用画家画资源图片
painter.drawPixmap(posX,100,QPixmap(":/img/1F929.png"));
}
绘图设备
QPixmap专门为图像在屏幕上的显示做了优化。
QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用QPixmap的isQBitmap()来确定这个QPixmap是不是一个QBitmap。
QImage专门为图像的像素级访问做了优化。
QPicture可以记录和重现QPainter的各条命令。
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//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:\\qt_learn\\p1\\paintdevice\\pix.png");
//QImage 绘图设备 可以对像素进行访问
QImage img(300,300,QImage::Format_ARGB32);
img.fill(Qt::white);
QPainter painter(&img);
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
img.save("D:\\qt_learn\\p1\\paintdevice\\img.png");
//Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//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:\\qt_learn\\p1\\paintdevice\\pix.png");
//QImage 绘图设备 可以对像素进行访问
QImage img(300,300,QImage::Format_ARGB32);
img.fill(Qt::white);
QPainter painter(&img);
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
img.save("D:\\qt_learn\\p1\\paintdevice\\img.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:\\qt_learn\\p1\\paintdevice\\pic.zt");
}
//绘图事件
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
//利用qimage对像素进行修改
QImage img;
img.load(":/img/1F929.png");
//修改像素点
for(int i=50;i<100;i++){
for(int j=50;j<100;j++){
QRgb value=qRgb(255,0,0);
img.setPixel(i,j,value);
}
}
painter.drawImage(0,0,img);
//重现QPicture的绘图指令
QPicture pic;
pic.load("D:\\qt_learn\\p1\\paintdevice\\pic.zt");
painter.drawPicture(0,0,pic);
}icture 绘图设备 可以记录和重现绘图指令
QPicture pic;
QPainter painter;
painter.begin(&pic);//开始
painter.setPen(QPen(Qt::red));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end();//结束
//保存到磁盘
pic.save("D:\\qt_learn\\p1\\paintdevice\\pic.zt");
}
//绘图事件
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
//利用qimage对像素进行修改
QImage img;
img.load(":/img/1F929.png");
//修改像素点
for(int i=50;i<100;i++){
for(int j=50;j<100;j++){
QRgb value=qRgb(255,0,0);
img.setPixel(i,j,value);
}
}
painter.drawImage(0,0,img);
//重现qpicture的绘图指令
QPicture pic;
pic.load("D:\\qt_learn\\p1\\paintdevice\\pic.zt");
painter.drawPicture(0,0,pic);
}
QFile文件读写操作
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
QString path = QFileDialog::getOpenFileName(this,"打开文件","D:\\desktop");
//将路径放入lineEdit
ui->lineEdit->setText(path);
//编码格式类
//QTextCodec* codec=QTextCodec::codecForName("gbk");
//读取内容 放入lineEdit
//QFile默认支持的格式是utf-8
QFile file(path);//参数就是读取文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray array;
// array=file.readAll();
while(!file.atEnd()){ //文件尾判断
array+=file.readLine();//按行读
}
//将读取到的数据 放入textEdit
ui->textEdit->setText(array);
//ui->textEdit->setText(codec->toUnicode(array);//转码
file.close();
//进行写文件
file.open(QIODevice::Append); //追加 writeonly 只写
file.write("aaaaaaa");
file.close();
});
QFileInfo 读取文件信息
QFileInfo info(path);
qDebug()<<"大小:"<<info.size()<<"后缀名:"<<info.suffix()<<"文件名称:"<<info.fileName()<<"文件路径:"<<info.filePath();
qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");
PushButton::clicked,this,={
QString path = QFileDialog::getOpenFileName(this,“打开文件”,“D:\desktop”);
//将路径放入lineEdit
ui->lineEdit->setText(path);
//编码格式类
//QTextCodec* codec=QTextCodec::codecForName("gbk");
//读取内容 放入lineEdit
//QFile默认支持的格式是utf-8
QFile file(path);//参数就是读取文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray array;
// array=file.readAll();
while(!file.atEnd()){ //文件尾判断
array+=file.readLine();//按行读
}
//将读取到的数据 放入textEdit
ui->textEdit->setText(array);
//ui->textEdit->setText(codec->toUnicode(array);//转码
file.close();
//进行写文件
file.open(QIODevice::Append); //追加 writeonly 只写
file.write("aaaaaaa");
file.close();
});
## QFileInfo 读取文件信息
```c++
QFileInfo info(path);
qDebug()<<"大小:"<<info.size()<<"后缀名:"<<info.suffix()<<"文件名称:"<<info.fileName()<<"文件路径:"<<info.filePath();
qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");