QT学习笔记(中)

QT学习笔记(中)

P21 消息对话框

QMessageBox静态成员函数 创建对话框
错误、信息、提问、警告

提问 参数: 父亲 标题 提示内容 按键类型 默认关联回车的按键
返回值是Standard Button类型,利用返回值可以判断用户的输入。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include<QDebug>
#include<QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);

    // 点击新建 弹框
    connect(ui->actionnew, &QAction::triggered, [=](){
    
    
       // 消息对话框
//       QMessageBox::critical(this, "critical", "错误");
       // 错误对话框
//       QMessageBox::information(this, "info", "信息");
       // 提问 参数: 父亲 标题 提示内容 按键类型 默认关联回车的按键
       QMessageBox::StandardButton sbtn = QMessageBox::question(this, "ques", "提问", QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Cancel);

       if (sbtn == QMessageBox::Save){
    
    
           qDebug() << "点击了保存按钮";
       }else{
    
    
           qDebug() << "点击了取消按钮";
       }

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

    });

}

MainWindow::~MainWindow()
{
    
    
    delete ui;
}


在这里插入图片描述

P22 其他标准对话框

  1. 颜色对话框:QColorDialog::getColor
  2. 文件对话框:QFileDialog::getOpenFileName() 参数:父亲,标题,默认路径,过滤。
  3. 字体对话框:QFontDialog::getFont()
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include<QDebug>
#include<QMessageBox>
#include<QColorDialog>
#include<QFileDialog>
#include<QFontDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);

    // 点击新建 弹框
    connect(ui->actionnew, &QAction::triggered, [=](){
    
    

//        QColor color = QColorDialog::getColor(QColor(255, 0, 0));
//        qDebug() << "r=" << color.red() << " g=" << color.green() << " b=" << color.blue();

        // 文件对话框  参数: 父亲 标题 默认打卡路径 过滤文件的格式
//        Qstring str = QFileDialog::getOpenFileName(this, "打开", "D:/", "(*.txt)");
//        qDebug() << str;

        // 字体对话框
        bool flag;
        QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
        qDebug() << "字体: " << font.family().toUtf8().data() << " 字号: " << font.pointSize() << " 是否加粗" << font.bold() << " 是否倾斜 " << font.italic();

    });


}

MainWindow::~MainWindow()
{
    
    
    delete ui;
}


P23 登录窗口界面和布局

在这里插入图片描述

  1. 实现登录窗口
  2. 利用布局方式 给窗口进行美化
  3. 选取widget 进行布局、水平布局、垂直布局、栅格布局。
  4. 给用户名、密码、登录、退出按钮进行布局
  5. 默认窗口和控件之间有9px的间隙,可以调整layoutLeftMargin
  6. 利用弹簧进行布局。
    请添加图片描述

P24 控件 按钮组

  1. QPushButton 常用按钮
  2. QToolButton 工具按钮,用于显示图片,如图想显示文字,
    2.1 修改风格:toolButtonStyle
    2.2 凸起风格 autoRaise
  3. redioButton 单选按钮。设置默认 ui->rBtnMan->setCheck(true)
  4. checkbox多选按钮,监控状态 2 选中 1 半选 0 未选中

在这里插入图片描述
代码部分:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    // 默认是选中 男
    ui->rbtnMan->setChecked(true);


    connect(ui->rbtnWoman, &QRadioButton::clicked, this, [=](){
    
    
        qDebug() << "选中了女";
    });
    // 多选按钮 2是选中 0是没有选中
    connect(ui->cbox, &QCheckBox::stateChanged, this, [=](int state){
    
    
        qDebug() <<state;
    });
}

Widget::~Widget()
{
    
    
    delete ui;
}


P25 QListWidget控件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QListWidget>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    // 默认是选中 男
    ui->rbtnMan->setChecked(true);


    connect(ui->rbtnWoman, &QRadioButton::clicked, this, [=](){
    
    
        qDebug() << "选中了女";
    });
    // 多选按钮 2是选中 0是没有选中
    connect(ui->cbox, &QCheckBox::stateChanged, this, [=](int state){
    
    
        qDebug() <<state;
    });

    // listWidget
    QListWidgetItem *item = new QListWidgetItem("锄禾日当午");
    // 放入控件中
//    ui->listWidget->addItem(item);
    // 居中对齐
//    item->setTextAlignment(Qt::AlignHCenter);
    // QStringList QList<QString>
    QStringList list;
    list << "锄禾日当午" << "汗滴禾下土" << "谁知盘中餐" << "粒粒皆辛苦";
    ui->listWidget->addItems(list);

}

Widget::~Widget()
{
    
    
    delete ui;
}


在这里插入图片描述

P26 QTreeWidget控件的使用

  1. 标题的创建 ui->treeWidget->setHeaderLabels(QStringList()<<“英雄”<<“英雄介绍”);
  2. 根节点的创建和加入
    ui->treeWidget->addTopLevelItems(QList<QTreeWidgetItem*>()<<liItem<<minItem<<zhiItem);
  3. 追加子节点 liItem->addChild(l1);
    代码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QList>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
    QTreeWidgetItem *liItem = new QTreeWidgetItem(QStringList()<<"力量");
    QTreeWidgetItem *minItem = new QTreeWidgetItem(QStringList()<<"敏捷");
    QTreeWidgetItem *zhiItem = new QTreeWidgetItem(QStringList()<<"智力");

    // 加载顶层节点
    ui->treeWidget->addTopLevelItems(QList<QTreeWidgetItem*>()<<liItem<<minItem<<zhiItem);

    // 追加子节点
    QStringList heroL1;
    heroL1 << "刚被猪" << "前排泰克";
    QTreeWidgetItem *l1 = new QTreeWidgetItem(heroL1);
    liItem->addChild(l1);

}

Widget::~Widget()
{
    
    
    delete ui;
}


在这里插入图片描述

P27 tableWidget

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    ui->tableWidget->setColumnCount(3);

    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<< "角色"<< "性别"<< "年龄");

    ui->tableWidget->setRowCount(3);

    QStringList nameList;
    nameList << "张飞" << "关羽" << "刘备";

    QList<QString> sexList;
    sexList << "男" << "女" << "男";
    for (int i =0; i<3; ++i){
    
    

        ui->tableWidget->setItem(i, 0, new QTableWidgetItem(nameList[i]));
        ui->tableWidget->setItem(i, 1, new QTableWidgetItem(sexList.at(i)));
        ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QTableWidgetItem(QString::number(18+i))));
    }


}

Widget::~Widget()
{
    
    
    delete ui;

}


在这里插入图片描述

P28 其他常用控件介绍

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    ui->stackedWidget->setCurrentIndex(1);

    connect(ui->pbtn, &QPushButton::clicked, [=](){
    
    
        ui->stackedWidget->setCurrentIndex(0);
    });

    connect(ui->rbtn, &QPushButton::clicked, [=](){
    
    
        ui->stackedWidget->setCurrentIndex(1);
    });

    ui->pbtn->setIcon(QIcon(":/Image/qq.png"));


    ui->comboBox->addItems(QStringList()<< "奔驰" << "宝马" << "拖拉机");

    connect(ui->vbtn, &QPushButton::clicked, [=](){
    
    
//        ui->comboBox->setCurrentIndex(2);
        ui->comboBox->setCurrentText("拖拉机");
    });

    ui->label->setPixmap(QPixmap(":/Image/qq.png"));


}

Widget::~Widget()
{
    
    
    delete ui;
}


在这里插入图片描述

P30 自定义控件

新建: 文件->newfile->Qt->Qt设计界面类
然后通过ui界面进行相关的设计。这里设置了一个QSlider和QSpinBox组合,数值改变时候进行联动。
在这里插入图片描述
在form.cpp添加下面的代码,定义两个控件之间的类和槽的连接,就可以实现联动。

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    
    
    ui->setupUi(this);

    connect(ui->spinBox, &QSpinBox::valueChanged, ui->horizontalSlider, &QSlider::setValue);
    connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);


}

Form::~Form()
{
    
    
    delete ui;
}

回到widget.ui界面中,拖拽一个widget出来,右键->提升为。输入刚刚新建的类名,就可以提升为自定义的控件。
在这里插入图片描述
定义自定义控件对外接口,在form.hpp,和form.cpp实现接口函数,这里就用两个接口,getValue,setValue。

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    
    
    ui->setupUi(this);

    connect(ui->spinBox, &QSpinBox::valueChanged, ui->horizontalSlider, &QSlider::setValue);
    connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);


}

Form::~Form()
{
    
    
    delete ui;
}


void Form::setValue(int num){
    
    
    ui->horizontalSlider->setValue(num);
    ui->spinBox->setValue(num);
}

int Form::getValue(){
    
    
    return ui->horizontalSlider->value();
}

最后在widget.ui拖拽两个按钮,然后连接这个widget的槽函数就可以了。

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);


    connect(ui->gbtn, &QPushButton::clicked, this, [=](){
    
    
        int num = ui->widget->getValue();
        qDebug() << "当前值是: " << num;
    });

    connect(ui->sbtn, &QPushButton::clicked, this, [=](){
    
    
        ui->widget->setValue(50);
    });

}

Widget::~Widget()
{
    
    
    delete ui;
}


P31 QEvent

qt中有好多事件,这里以鼠标事件为例,新建一个QLabel的控件。
在这里插入图片描述
可以再mylabel.h, mylabel.cpp中设置事件的处理方法
关于QLabel的鼠标事件,我们可以直接看帮助文档,下面是QLabel的帮助文档以及相关的截图。
在这里插入图片描述

mylabel.h,这里定义了4个鼠标事件,

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>
#include<QPointingDevice>

class myLabel : public QLabel
{
    
    
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);


    void leaveEvent(QEvent *event);


    void mouseMoveEvent(QMouseEvent *ev);
    void mousePressEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);



signals:

};

#endif // MYLABEL_H

mylabel.cpp 事件的实现。

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

myLabel::myLabel(QWidget *parent)
    : QLabel{
    
    parent}
{
    
    
    setMouseTracking(true);
}




void myLabel::leaveEvent(QEvent *event){
    
    
    qDebug()<< "鼠标离开了";
}



void myLabel::mousePressEvent(QMouseEvent *ev){
    
    
    qDebug()<< "鼠标按下了";
    // 左键按下才捕获
    if (ev->button()==Qt::LeftButton){
    
    
        QString str = QString("x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
        qDebug()<< str;
    }
}

void myLabel::mouseReleaseEvent(QMouseEvent *ev){
    
    
    qDebug()<< "鼠标释放了";
}


void myLabel::mouseMoveEvent(QMouseEvent *ev){
    
    
    qDebug()<< "鼠标移动了";
    QString str = QString("x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
    qDebug()<< str;

//    if (ev->buttons() & Qt::LeftButton){
    
    
//        QString str = QString("x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
//        qDebug()<< str;
//    }
}

运行后自动捕获鼠标事件,并且输出当前光标的位置了。
在这里插入图片描述

P32 定时器(一)

使用startTimer去创建定时器。
核心:在widget.h先重写timerEvent,然后通过startTimer去启动定时器,startTimer返回定时器的编号作为标识符。
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    
    
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void timerEvent(QTimerEvent *);
    int timer_id1;
    int timer_id2;

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
    // 1000ms 计时一次
    timer_id1 = startTimer(1000);
    timer_id2 = startTimer(2000);

}

Widget::~Widget()
{
    
    
    delete ui;
}



void Widget::timerEvent(QTimerEvent *ev){
    
    
    static int i = 0;
    static int j = 0;

    if (ev->timerId() == timer_id1){
    
    
        ui->label_2->setText(QString::number(++i));
    }

    if (ev->timerId() == timer_id2){
    
    
        ui->label_3->setText(QString::number(++j));
    }
}

在这里插入图片描述

P33 定时器(二)这个定时器更简单,更优

使用QTimer去创建一个定时器类,然后每隔一定时间触发一个信号,然后调用槽函数。

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
    // 1000ms 计时一次
    timer_id1 = startTimer(1000);
    timer_id2 = startTimer(2000);

    QTimer *timer = new QTimer(this);

    timer->start(500);
    connect(timer, &QTimer::timeout, this, [=](){
    
    
        static int num = 1;
        ui->label_4->setNum(++num);
    });
    // 控制定时器开始
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
    
    
        timer->start(500);
    });
    // 控制定时器停止
    connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
    
    
        timer->stop();
    });



}

Widget::~Widget()
{
    
    
    delete ui;
}



void Widget::timerEvent(QTimerEvent *ev){
    
    
    static int i = 0;
    static int j = 0;

    if (ev->timerId() == timer_id1){
    
    
        ui->label_2->setText(QString::number(++i));
    }

    if (ev->timerId() == timer_id2){
    
    
        ui->label_3->setText(QString::number(++j));
    }
}

在这里插入图片描述

P34 Event事件分发器

在这里插入图片描述1. 用途,用于事件的分发
2. 可以做事件的拦截
3. bool event(QEvent *e)
4. 返回值如果是true代表用户已经处理了这个时间,不再向下分发
5. e->type() == 鼠标按下

需要在mylabel.h添加这个函数的定义,这里由于篇幅问题就不贴出来了。下面是mylabel.cpp里面函数的实现。

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

myLabel::myLabel(QWidget *parent)
    : QLabel{
    
    parent}
{
    
    
    setMouseTracking(true);
}




void myLabel::leaveEvent(QEvent *event){
    
    
    qDebug()<< "鼠标离开了";
}



void myLabel::mousePressEvent(QMouseEvent *ev){
    
    
    qDebug()<< "鼠标按下了";
    // 左键按下才捕获
    if (ev->button()==Qt::LeftButton){
    
    
        QString str = QString("x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
        qDebug()<< str;
    }
}

void myLabel::mouseReleaseEvent(QMouseEvent *ev){
    
    
    qDebug()<< "鼠标释放了";
}


void myLabel::mouseMoveEvent(QMouseEvent *ev){
    
    
    qDebug()<< "鼠标移动了";
    QString str = QString("x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
    qDebug()<< str;
    // 判断是左键按下才执行
//    if (ev->buttons() & Qt::LeftButton){
    
    
//        QString str = QString("x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
//        qDebug()<< str;
//    }
}

bool myLabel::event(QEvent *e){
    
    
    if (e->type()==QEvent::MouseButtonPress){
    
    
        QMouseEvent *ev = static_cast<QMouseEvent*>(e);
        QString str = QString("QEvent中进行拦截。 鼠标按下了。x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
        qDebug()<< str;
        return true; // 返回true
    }
    return QLabel::event(e);
}

在这里插入图片描述
上面运行结果可以看到,鼠标按下QLabel时候,event方法已经进行了拦截。从而没有调用mousePressEvent方法。

P35 使用事件过滤器进行一个更高层的拦截

下图可以看到eventfilter事件过滤器在
在这里插入图片描述
具体实现步骤如下:

注意,我们是在最大的窗口那里实现的,并非我们的控件的文件!!!
即,在widget.cpp中实现

  1. 在widget.cpp 中安装事件过滤器:
    // 安装事件过滤器
    ui->label->installEventFilter(this);
  1. 在widget.h定义eventFilter(QObject*, QEvent*)函数
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    bool eventFilter(QObject*, QEvent*);
  1. 在widget.cpp实现eventFilter
bool Widget::eventFilter(QObject *obj, QEvent *e){
    
    
    if (obj==ui->label){
    
    
        if (e->type()==QEvent::MouseButtonPress){
    
    
            QMouseEvent *ev = static_cast<QMouseEvent*>(e);
            QString str = QString("eventFilter中进行拦截。 鼠标按下了。x=%1, y=%2, globalx=%3, globaly=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalY());
            qDebug()<< str;
            return true; // 返回true
        }
    }
    return QWidget::eventFilter(obj, e);
}

在这里插入图片描述
上面结果可以看到,eventFilter在最上层进行了拦截,就没有去运行bool myLabel::event(QEvent *e)的代码了,更不用说下面这上个myLabel中从QLabel继承过来的具体事件。

    void mouseMoveEvent(QMouseEvent *ev);
    void mousePressEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

P36 绘图事件

使用QPainter进行绘图操作。设置pen,brush等。

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
}

Widget::~Widget()
{
    
    
    delete ui;
}

void Widget::paintEvent(QPaintEvent *){
    
    
    // 实例化画家对象
    QPainter painter(this);
    // 设置笔的颜色
    QPen pen(QColor(255, 0, 0));
    // 设置画笔宽度
    pen.setWidth(3);
    // 设置画笔风格
    pen.setStyle(Qt::DashLine);
    // 让画家使用画笔
    painter.setPen(pen);

    // 设置画刷
    QBrush brush(Qt::green);
    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, 100, 50), "好好学习,天天向上");

}


在这里插入图片描述

P37 绘图的高级设置

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
}

Widget::~Widget()
{
    
    
    delete ui;
}

void Widget::paintEvent(QPaintEvent *){
    
    
    // 实例化画家对象
    QPainter painter(this);
    // 设置笔的颜色
    QPen pen(Qt::blue);
    pen.setWidth(2);
    painter.setPen(pen);

    painter.drawEllipse(QPoint(100, 50), 50, 50);
    // 抗锯齿
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200, 50), 50, 50);

    painter.drawRect(QRect(50, 150, 50, 50));
    // 移动画家的原点 x方向移动100, y 方向移动 0
    painter.translate(QPoint(100, 0));
    // 保存画家的相对位置
    painter.save();
    painter.drawRect(QRect(50, 150, 50, 50));

    painter.translate(QPoint(100, 0));
    // 恢复到上一次保存的位置
    painter.restore();

    painter.drawRect(QRect(50, 150, 50, 50));
}

在这里插入图片描述

P38 手动调用并更新绘图事件

使用QPainter来绘图,并手动更新绘图,下面代码实现点击QPushButton图片向右移动20px,或者定时触发自动右移20px的功能。

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
    // 点击按钮移动20px
    connect(ui->pushButton, &QPushButton::clicked, [=](){
    
    
        Xpos += 20;
        update();
    });
    // 定时移动20px
    QTimer *timer = new QTimer(this);
    timer->start(500);
    connect(timer, &QTimer::timeout, [=](){
    
    
        Xpos += 20;
        update();
    });

}

Widget::~Widget()
{
    
    
    delete ui;
}


void Widget::paintEvent(QPaintEvent *){
    
    
    QPainter painter(this);
    painter.drawPixmap(Xpos, 50, QPixmap(":/Image/qq.png"));

    if (Xpos > this->width()){
    
    
        Xpos = 0;
    }

}


在这里插入图片描述

P39 绘图设备

QPaintDevice分为QPixmap,Qimage以及QPicture,QPainter可以再设备上面画画,不同设备的特性是略有不一样的。

QPixmap:
对不同平台的显示进行优化,但支持像素级别的访问。下面图片是QPainter在QPixmap上面进行画画并且保存后得到的结果。
请添加图片描述

Qimage:
可以支持像素级别访问。下面实例通过for循环修改了一部分的像素。
请添加图片描述

QPicture:
用于记录和保存QPainter画家的操作方法,然后可以载入方法进行画画。保存的路径文件名为zt,是不能打开的,只能通过QPicture的load方法访问读取。
请添加图片描述
上面实例的代码统一基础在下面,注意的是,绘图时间paintEvent需要在widget.h头文件上面去申明。

#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QPicture>



Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    // Pixmap绘图设备
    QPixmap pix(300, 300);
    // 定义画家
    QPainter painter(&pix);
    // 填充白色
    pix.fill(Qt::white);
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150, 150), 100, 100);
    // 保存
    pix.save("D:/pix.png");

    // QImage绘图设备 可以对像素进行访问
    QImage img(300, 300, QImage::Format_RGB32);
    img.fill(Qt::white);

    QPainter painter2(&img);
    painter2.setPen(QPen(Qt::blue));
    painter2.drawEllipse(QPoint(150, 150), 100, 100);
    img.save("D:/img.png");

    // QPicture 绘图设备
    QPicture pic;
    QPainter painter3;
    painter3.begin(&pic);
    painter3.setPen(QPen(Qt::green));

    QBrush brush(Qt::red);
    brush.setStyle(Qt::RadialGradientPattern);
    painter3.setBrush(brush);
    painter3.drawEllipse(QPoint(100, 100), 100, 100);
    // 退出指令不能少,否则保存的路径是空的
    painter3.end();
    // 保存一个绘图指令文件,里面有画家的绘图方法
    pic.save("D:/picture.zt");

}

Widget::~Widget()
{
    
    
    delete ui;
}


// 绘图事件
void Widget::paintEvent(QPaintEvent *){
    
    
    QPainter painter(this);
    QImage img;

    img.load(":/Image/clock.png");

    QRgb rgb = qRgb(255, 0, 255);
    for (int i=0; i<100; ++i){
    
    
        for (int j=0; j<100; ++j){
    
    
            img.setPixel(i, j, rgb);
        }
    }
    painter.drawImage(0, 0, img);

    QPainter painter3(this);
    QPicture pic;
    pic.load("D:/picture.zt");
    painter3.drawPicture(0, 0, pic);

}


P40 文件的读写操作

使用QFile进行文件的读写操作

  1. QFile fIle(path 文件路径)
  2. 全部读取 file.readAll()
  3. 编码问题,使用QTextCodec来进行转码操作
  4. 写 filel.write(char *)
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
// 需要在 pro文件加入 QT += core5compat
#include <QTextCodec>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    connect(ui->pushButton, &QPushButton::clicked, [=](){
    
    
        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\project\\QT\\day03\\05_QFile", "*.txt");
        ui->lineEdit->setText(path);
        QFile file(path);

        file.open(QIODeviceBase::ReadOnly);
        // 一次读取
//        QByteArray array =  file.readAll();

        // 按行来读取
        QByteArray array;
        while(!file.atEnd()){
    
    
            array += file.readLine();
        }
        ui->textEdit->setText(array);

        // GBK
//        QTextCodec *codec = QTextCodec::codecForName("gbk");
//        ui->textEdit->setText(codec->toUnicode(array));
        file.close();

        // 写文件
        file.open(QIODeviceBase::Append);
        file.write("\n新添加的内容");
        file.close();

    });


}

Widget::~Widget()
{
    
    
    delete ui;
}


在这里插入图片描述

P41 QFileInfo文件信息读取操作

读取文件的相关信息并且弹窗来打印

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
// 需要在 pro文件加入 QT += core5compat
#include <QTextCodec>
#include <QFileInfo>
#include <QDebug>
#include <QMessageBox>
#include <QDateTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    connect(ui->pushButton, &QPushButton::clicked, [=](){
    
    
        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\project\\QT\\day03\\05_QFile", "*.txt");
        ui->lineEdit->setText(path);
        QFile file(path);

        file.open(QIODeviceBase::ReadOnly);
        // 一次读取
//        QByteArray array =  file.readAll();

        // 按行来读取
        QByteArray array;
        while(!file.atEnd()){
    
    
            array += file.readLine();
        }
        ui->textEdit->setText(array);

        // GBK
//        QTextCodec *codec = QTextCodec::codecForName("gbk");
//        ui->textEdit->setText(codec->toUnicode(array));
        file.close();

        // 写文件
        file.open(QIODeviceBase::Append);
//        file.write("\n新添加的内容");
        file.close();

        QFileInfo info(path);
        QString str = QString("大小=%1, 后缀名=%2, 文件名称=%3, 文件路径=%4").arg(info.size()).arg(info.suffix()).arg(info.fileName()).arg(info.filePath());
        QMessageBox::information(this, "文件信息", str);

        QDateTime time = info.birthTime();
        QMessageBox::information(this, "创建日期", time.toString("yyyy-MM-dd hh:mm:ss"));

    });


}

Widget::~Widget()
{
    
    
    delete ui;
}


请添加图片描述

猜你喜欢

转载自blog.csdn.net/HELLOWORLD2424/article/details/128282509
今日推荐