Qt基础入门

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

返回值类型指定 ->int{ };

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

资源文件

  1. 将图片文件拷贝到项目文件下
  2. 创建新文件:右键项目——添加qt——qtresourcefile
  3. 生成.qrc
  4. 打开:open in editor 编辑资源
  5. 添加前缀——添加文件
  6. 使用:”:+前缀+文件名
    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();

自定义控件封装

  1. 添加新文件:qt——qt widgets designer form class——widget
  2. .ui中设计控件,自定义封装
  3. 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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值