QT编程(二)

1.QT中的事件

1.1 鼠标的事件

  • 需要自定义控件
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

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

    //鼠标的进入事件
    void enterEvent(QEvent *event);

    //鼠标的离开事件
    void leaveEvent(QEvent *event);

    //鼠标按下
    void mousePressEvent(QMouseEvent *ev);

    //鼠标释放
    void mouseReleaseEvent(QMouseEvent *ev);

    //鼠标移动
    void mouseMoveEvent(QMouseEvent *ev);


signals:

};

#endif // MYLABEL_H
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪
    setMouseTracking(true);
}

//鼠标的进入事件
void myLabel::enterEvent(QEvent *event)
{
    qDebug() << "鼠标进入了";
}

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

//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{
    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)
{
    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::mouseMoveEvent(QMouseEvent *ev)
{
//    if(ev->buttons() & Qt::LeftButton) //移动是连续状态,用buttons   用&位与来判断
//    {
        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;
//    }

}

1.2 定时器1

头文件

#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 id1;
    int id2;

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

源文件

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //启动计时器
    connect(ui->timerBtn,&QPushButton::clicked,[=]()
    {
       id1 = startTimer(1000);	//返回值是定时器id

       id2 = startTimer(2000);
    });
}

void Widget::timerEvent(QTimerEvent *ev)
{
    if(ev->timerId() == id1)
    {
        static int num = 1;
        //每隔一秒  +1
        ui->label->setText(QString::number(num++));
    }
    else
    {
        //每隔两秒  +1
        static int num1 = 1;
        ui->label_2->setText(QString::number(num1++));
    }

}

Widget::~Widget()
{
    delete ui;
}
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //启动计时器

    //定时器的第二种方式
    QTimer * timer = new QTimer(this);

    connect(ui->timerBtn,&QPushButton::clicked,[=]()
    {
       id1 = startTimer(1000);

       id2 = startTimer(2000);

       //启动定时器
       timer->start(500);
       connect(timer,&QTimer::timeout,[=](){
           static int num2 = 1;
            ui->label_3->setText(QString::number(num2++));
       });
    });

    //暂停计时
    connect(ui->pauseBtn,&QPushButton::clicked,[=]()
    {
        timer->stop();
    });
}

void Widget::timerEvent(QTimerEvent *ev)
{
    if(ev->timerId() == id1)
    {
        static int num = 1;
        //每隔一秒  +1
        ui->label->setText(QString::number(num++));
    }
    else
    {
        //每隔两秒  +1
        static int num1 = 1;
        ui->label_2->setText(QString::number(num1++));
    }

}

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

1.3 QPainter

头文件

#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 paintEvent(QPaintEvent *event);

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

源文件

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *event)
{
    //实例化画家对象   this指定绘图设备
    QPainter painter(this);

    //设置画笔
    QPen pen(QColor(255,0,0));

    //设置画笔的宽度
    pen.setWidth(5);

    //设置画笔风格
    pen.setStyle(Qt::DotLine);

    //画刷填充颜色
    QBrush brush(QColor(0,255,0));
    brush.setStyle(Qt::Dense7Pattern);
    painter.setBrush(brush);

    //让画家拿起笔
    painter.setPen(pen);

    painter.drawLine(QPoint(0,0),QPoint(100,100));

    painter.drawEllipse(QPoint(100,100),50,50);

    painter.drawRect(QRect(QPoint(0,0),QPoint(100,100)));

    painter.drawText(QRect(200,200,150,150),"好好学习,天天向上");

}

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

1.4 QPainter高级设置

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

//    painter.drawEllipse(QPoint(200,200),50,50);
//    //设置抗锯齿能力  效率较低
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(200,300),50,50);

    //矩形
    painter.drawRect(QRect(200,200,50,50));

    //移动画家
    painter.translate(100,0);

    //保存画家状态
    painter.save();

    painter.drawRect(QRect(200,200,50,50));

    painter.translate(100,0);

    //还原画家状态
    painter.restore();

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

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

1.5 手动调用绘图事件

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QTimer>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QTimer *timer = new QTimer(this);

    connect(ui->pushButton,&QPushButton::clicked,[=](){

        timer->start(1000);

        connect(timer,&QTimer::timeout,[=](){
            posX += 20;

            //如果要手动调用绘图事件  用update更新
            update();
        });
    });

    connect(ui->pushButton_2,&QPushButton::clicked,[=](){
       timer->stop();
    });
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //如果超出屏幕  从0开始
    if(posX > this->width())
    {
        posX = 0;
    }

    painter.drawPixmap(posX,0,QPixmap(":/image/favicon.ico"));

}

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

1.6 绘图设备

  • QPixmap专门为图像在屏幕上的显示做了优化
  • QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用QPixmap的isQBitmap()来确定这个QBitmap是不是一个QBitmap
  • QImage专门为图像的像素级访问做了优化
  • QPicture则可以记录和重现QPainter的各条命令

头文件

#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 paintEvent(QPaintEvent *event);

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

源文件

#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QDebug>
#include <QPicture>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //    //Pixmap绘图设备
    //    QPixmap pix(300,300);

    //    //填充背景色
    //    pix.fill(Qt::transparent);

    //    //声明画家
    //    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::cyan));

    //    painter.drawEllipse(QPoint(150,150),100,100);

    //    img.save("E://img.png");


    //QPicture 绘图设备
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);

    painter.setPen(QPen(Qt::blue));

    painter.drawEllipse(QPoint(150,150),100,100);

    painter.end();

    pic.save("E:\\pic.zt"); //记录了这些指令



}

void Widget::paintEvent(QPaintEvent *event)
{
//    QPainter painter(this);

//    //利用QImage 对像素进行修改
//    QImage img;
//    img.load(":/image/favicon.ico");

//    //修改像素点
//    for(int i = 0;i < 64 ; i++)
//    {
//        for (int j = 0;j < 64;j++) {
//            if(img.pixelColor(i,j) != QColor(255,255,255))
//            {
//                QRgb value = qRgb(255,0,0);
//                img.setPixel(i ,j, value);
//            }
//           // qDebug() << img.pixelColor(i,j);
//        }
//    }

//    painter.drawImage(100,100,img);

    //重现QPicture指令
    QPainter painter(this);
    QPicture pic;
    pic.load("E:\\pic.zt");
    painter.drawPicture(0,0,pic);

}

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

1.7 QFile 进行文件读写

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#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,"打开文件","C:\\Users\\ShuaiZheng\\Desktop","*.txt");

        //路径放入到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("aaaaaaaaa");

        file.close();


    });
}

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

1.8 QFileInfo文件信息读取

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#include <QTextCodec>
#include <QFileInfo>
#include <QDebug>
#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,"打开文件","C:\\Users\\ShuaiZheng\\Desktop","*.txt");

        //路径放入到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();

        //将读取到的数据 放入textEdit
        ui->textEdit->setText(array);
        //ui->textEdit->setText(codec->toUnicode(array));

        //QFileInfo文件信息类
        QFileInfo info(path);

        qDebug() << "大小:" << info.size() << "后缀名:" <<info.suffix()
                 << "文件名:" <<info.fileName() << "文件路径:" << info.filePath();
        qDebug() <<"创建日期:" <<info.birthTime().toString("yyyy/MM/dd HH:mm:ss")
                << "修改日期:" << info.lastModified().toString("yyyy-MM-dd HH:mm:ss");
    });
}

Widget::~Widget()
{
    delete ui;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值