Qt#第十二章:文件属性以及鼠标事件、键盘事件、事件过滤器

   文件属性

        Qt中提供了专门的类来获取文件属性,QFileInfo 可以获取文件的属性、创建时间、文件的大小、文件的扩展名、文件是否存在、文件是否可读可写等;

#ifndef GETFILEINFO_H
#define GETFILEINFO_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>

#include <QFileDialog> // 引用文件对话框
#include <QDateTime>
#include <QHBoxLayout>
#include <QVBoxLayout>

class GetFileInfo : public QDialog
{
    Q_OBJECT
public:
    GetFileInfo(QWidget *parent = nullptr);
    ~GetFileInfo();
private:
    QLabel *labelfilename;
    QLineEdit *qlineeditfilename;
    QPushButton *qpushbuttongetfilename;

    // 文件容量大小
    QLabel *labelfilesize;
    QLineEdit *qlineeditfilesize;

    // 文件创建时间
    QLabel *labelfilecreatetime;
    QLineEdit *qlineeditfilecreatetime;

    // 文件修改时间
    QLabel *labelfilemodifytime;
    QLineEdit *qlineeditfilemodifytime;

    // 文件访问时间
    QLabel *labelfileaccesstime;
    QLineEdit *qlineeditfileaccesstime;

    // 文件属性及复选控件
    QLabel *qlabelfileattribute;

    QCheckBox *qcheckboxisfile;
    QCheckBox *qcheckboxishide;
    QCheckBox *qcheckboxisreadable;
    QCheckBox *qcheckboxiswritable;
    QCheckBox *qcheckboxisexecute;
    QPushButton *qpushbuttongetfileattributeinfo;

    // 声明槽函数
private slots:
    void getfilepathandname();
    void getfileattributeinfo();
};
#endif // GETFILEINFO_H
#include "getfileinfo.h"

GetFileInfo::GetFileInfo(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("获取文件属性项目实战模块");

    labelfilename=new QLabel("文件路径名称:");
    qlineeditfilename=new QLineEdit;
    qpushbuttongetfilename=new QPushButton("打开文件...");

    labelfilesize=new QLabel("文件容量大小:");
    qlineeditfilesize=new QLineEdit;

    labelfilecreatetime=new QLabel("文件创建时间:");
    qlineeditfilecreatetime=new QLineEdit;

    labelfilemodifytime=new QLabel("文件修改时间:");
    qlineeditfilemodifytime=new QLineEdit;

    labelfileaccesstime=new QLabel("文件访问时间:");
    qlineeditfileaccesstime=new QLineEdit;

    qlabelfileattribute=new QLabel("文件属性");
    qcheckboxisfile=new QCheckBox("文件");
    qcheckboxishide =new QCheckBox("隐藏属性");
    qcheckboxisreadable =new QCheckBox("只读属性");
    qcheckboxiswritable=new QCheckBox("只写属性");
    qcheckboxisexecute=new QCheckBox("执行权限");
    qpushbuttongetfileattributeinfo=new QPushButton("获取文件属性的全部数据信息...");

    // 布局
    QGridLayout *glayout=new QGridLayout;
    glayout->addWidget(labelfilename,0,0);
    glayout->addWidget(qlineeditfilename,0,1);
    glayout->addWidget(qpushbuttongetfilename,0,2);

    glayout->addWidget(labelfilesize,1,0);
    glayout->addWidget(qlineeditfilesize,1,1,1,2);

    glayout->addWidget(labelfilecreatetime,2,0);
    glayout->addWidget(qlineeditfilecreatetime,2,1,1,2);

    glayout->addWidget(labelfilemodifytime,3,0);
    glayout->addWidget(qlineeditfilemodifytime,3,1,1,2);

    glayout->addWidget(labelfileaccesstime,4,0);
    glayout->addWidget(qlineeditfileaccesstime,4,1,1,2);

    // 水平布局
    QHBoxLayout *hlayout=new QHBoxLayout;
    hlayout->addWidget(qlabelfileattribute);
    hlayout->addStretch();

    QHBoxLayout *hlayoutat=new QHBoxLayout;
    hlayoutat->addWidget(qcheckboxisfile);
    hlayoutat->addWidget(qcheckboxishide);
    hlayoutat->addWidget(qcheckboxisreadable);
    hlayoutat->addWidget(qcheckboxiswritable);
    hlayoutat->addWidget(qcheckboxisexecute);

    QHBoxLayout *hlayoutgetbtn=new QHBoxLayout;
    hlayoutgetbtn->addWidget(qpushbuttongetfileattributeinfo);

    //  垂直布局
    QVBoxLayout *vlayout=new QVBoxLayout(this);
    vlayout->addLayout(glayout);
    vlayout->addLayout(hlayout);
    vlayout->addLayout(hlayoutat);
    vlayout->addLayout(hlayoutgetbtn);

    // 信号与槽函数连接
    connect(qpushbuttongetfilename,SIGNAL(clicked()),this,SLOT(getfilepathandname()));

    connect(qpushbuttongetfileattributeinfo,SIGNAL(clicked()),this,SLOT(getfileattributeinfo()));
}

GetFileInfo::~GetFileInfo()
{
}

void GetFileInfo::getfilepathandname()
{
    QString filepathname;
    filepathname=QFileDialog::getOpenFileName(this,"打开文件对话框","/","files(*)");
    qlineeditfilename->setText(filepathname);

}

void GetFileInfo::getfileattributeinfo()
{
    QString strfile=qlineeditfilename->text();

    QFileInfo qfi(strfile);

    qint64 filesize=qfi.size(); // 获取文件容量大小
    QDateTime createtime=qfi.created(); // 文件创建时间
    QDateTime lastmodifytime=qfi.lastModified(); // 最后修改时间
    QDateTime lastaccesstime=qfi.lastRead(); // 最后访问时间

    bool bfile=qfi.isFile();
    bool bhide=qfi.isHidden();
    bool bread=qfi.isReadable();
    bool bwrite=qfi.isWritable();
    bool bexecute=qfi.isExecutable();

    qlineeditfilesize->setText(QString::number(filesize));
    qlineeditfilecreatetime->setText(createtime.toString());
    qlineeditfilemodifytime->setText(lastmodifytime.toString());
    qlineeditfileaccesstime->setText(lastaccesstime.toString());

    qcheckboxisfile->setCheckState(bfile?Qt::Checked:Qt::Unchecked);
    qcheckboxishide->setCheckState(bhide?Qt::Checked:Qt::Unchecked);
    qcheckboxisreadable->setCheckState(bread?Qt::Checked:Qt::Unchecked);
    qcheckboxiswritable->setCheckState(bwrite?Qt::Checked:Qt::Unchecked);
    qcheckboxisexecute->setCheckState(bexecute?Qt::Checked:Qt::Unchecked);
}

鼠标事件

       QMouseEvent继承于QObject,派生出MouseEvent类 ,它主要用于捕获和处理用户通过鼠标进行的交互操作,例如点击、移动、释放鼠标按钮等。

  1. button():返回一个枚举类型 Qt::MouseButton,表示触发事件的鼠标按钮类型。
  2. buttons():返回一个枚举类型 Qt::MouseButtons,表示当前鼠标按下的所有按钮。
  3. pos():返回一个 QPoint 对象,表示鼠标事件发生时的坐标位置。
  4. globalPos():返回一个 QPoint 对象,表示鼠标事件发生时的全局坐标位置。
  5. modifiers():返回一个枚举类型 Qt::KeyboardModifiers,表示事件发生时的键盘修饰符状态。
  6. x() 和 y():分别返回事件发生时的 x 坐标和 y 坐标。
  7. globalX() 和 globalY():分别返回事件发生时的全局 x 坐标和全局 y 坐标。
  8. accept() 和 ignore():用于接受或忽略该事件,可以控制事件的传递和处理。
  9. 重写事件处理函数(如 mousePressEvent()mouseMoveEvent()mouseReleaseEvent() 等)来处理鼠标事件,并根据需要对鼠标操作进行相应的响应和逻辑处理

        

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QMouseEvent> // 鼠标事件
#include <QStatusBar>  // 窗口状态栏实现
#include <QMessageBox>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void mouseMoveEvent(QMouseEvent *e);
    void mousePressEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
private:
    QLabel *statuslabel;
    QLabel *mouselabelpos;

    void disppicture();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("测试鼠标事件程序");

    statuslabel=new QLabel;
    statuslabel->setText("鼠标在当前窗口坐标为:");
    statuslabel->setFixedWidth(200);

    mouselabelpos=new QLabel;
    mouselabelpos->setText("");
    mouselabelpos->setFixedWidth(200);

    // 在状态栏当中添加窗口小控件对象
    statusBar()->addPermanentWidget(statuslabel);
    statusBar()->addPermanentWidget(mouselabelpos);

    this->setMouseTracking(true); // 鼠标实时追踪

    resize(800,600);

    disppicture(); // 调用显示图片
}

MainWindow::~MainWindow()
{
}

// 鼠标移动
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    mouselabelpos->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
}

// 判断鼠标按键
void MainWindow::mousePressEvent(QMouseEvent *e)
{
    QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
    if(e->button()==Qt::LeftButton)
    {
        statusBar()->showMessage("用户已按下鼠标[左键]坐标"+qstr);
    }
    else if(e->button()==Qt::RightButton)
    {
        statusBar()->showMessage("用户已按下鼠标[右键]坐标"+qstr);
    }
    else if(e->button()==Qt::MidButton)
    {
        statusBar()->showMessage("用户已按下鼠标[中键]坐标"+qstr);
    }
}

// 释放鼠标按键
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
    QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";

    statusBar()->showMessage("用户已释放鼠标坐标"+qstr,20);
}

void MainWindow::disppicture()
{
    QString filenames("d:/1.jpg");

    QImage *image=new QImage;
    QLabel *imagelabel=new QLabel(this);

    imagelabel->move(20,20); //
    imagelabel->setFixedSize(700,400);

    if(!(image->load(filenames)))
    {
        QMessageBox::information(this,"失败","加载图片失败,请重新检查?");
        delete  image;
        return;
    }
    imagelabel->setPixmap(QPixmap::fromImage(*image));
}
键盘事件

        QKeyEvent 是 Qt 框架中的一个类,用于表示键盘事件。它继承自 QInputEvent 类,并提供了一些额外的属性和方法来处理与键盘相关的用户输入。

QKeyEvent 主要用于捕获和处理用户通过键盘进行的交互操作,例如按下按键、释放按键等。

以下是 QKeyEvent 常用的属性和方法:

  1. key():返回一个枚举类型 Qt::Key,表示触发事件的按键键值。
  2. modifiers():返回一个枚举类型 Qt::KeyboardModifiers,表示事件发生时的键盘修饰符状态。
  3. text():返回一个字符串,表示按下按键对应的字符,考虑到键盘布局和输入法的影响。
  4. isAutoRepeat():返回一个布尔值,表示按键事件是否为自动重复(长按)事件。
  5. accept() 和 ignore():用于接受或忽略该事件,可以控制事件的传递和处理。
  6. 重写事件处理函数(如 keyPressEvent()keyReleaseEvent() 等)来处理键盘事件,并根据需要对键盘操作进行相应的响应和逻辑处理
#ifndef KEYBOARDEVENT_H
#define KEYBOARDEVENT_H

#include <QWidget>
#include <QKeyEvent>
#include <QPaintEvent>
#include <QPainter>

class keyboardevent : public QWidget
{
    Q_OBJECT
public:
    keyboardevent(QWidget *parent = nullptr);
    ~keyboardevent();
    void drawpixfunc();
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *); // 键盘按钮控制老虎动向
private:
    QPixmap *pix;
    QImage image;
    int startx;
    int starty;
    int width; // 获取窗口宽度
    int height; // 获取窗口高度
    int step; // 步长

};
#endif // KEYBOARDEVENT_H
#include "keyboardevent.h"

keyboardevent::keyboardevent(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("键盘事件测试:控制老虎动向");

    setAutoFillBackground(true);

    // QPalette是Qt中调度板类
    QPalette plet=this->palette();
    plet.setColor(QPalette::Window,Qt::white);
    setPalette(plet);

    setMinimumSize(800,600);
    setMaximumSize(800,600);

    width=size().width();
    height=size().height();

    pix=new QPixmap(width,height);
    pix->fill(Qt::white);

    image.load("d:/tiger.jpg");

    startx=30;
    starty=30;
    step=30;

    drawpixfunc(); // 调用函数绘制
    resize(800,600);
}

keyboardevent::~keyboardevent()
{
}

void keyboardevent::drawpixfunc()
{
    pix->fill(Qt::green);

    QPainter *painter=new QPainter;
    QPen pen(Qt::DashDotLine); // 点划线

    for(int i=step;i<width;i=i+step) // 竖线
    {
        painter->begin(pix);
        painter->setPen(pen);
        painter->drawLine(QPoint(i,0),QPoint(i,height));
        painter->end();
    }

    for(int j=step;j<height;j=j+step) // 横线
    {
        painter->begin(pix);
        painter->setPen(pen);
        painter->drawLine(QPoint(0,j),QPoint(width,j));
        painter->end();
    }
    painter->begin(pix);
    painter->drawImage(QPoint(startx,starty),image);
    painter->end();
}

void keyboardevent::paintEvent(QPaintEvent *)
{
    QPainter pt;
    pt.begin(this);
    pt.drawPixmap(QPoint(0,0),*pix);
    pt.end();
}

void keyboardevent::keyPressEvent(QKeyEvent *evt) // 键盘按钮控制老虎动向
{
    startx=startx-startx%step; 
    starty=starty-starty%step;

    if(evt->key()==Qt::Key_Left)
    {
        startx=(startx-step<0)?startx:startx-step;
    }
    if(evt->key()==Qt::Key_Right)
    {
        startx=(startx+step+image.width()>width)?startx:startx+step;
    }

    if(evt->key()==Qt::Key_Up)
    {
        starty=(starty-step<0)?starty:starty-step;
    }
    if(evt->key()==Qt::Key_Down)
    {
        starty=(starty+step+image.height()>height)?starty:starty+step;
    }
    // 调用绘制
    drawpixfunc();
    update();
}
事件过滤

        它是专门拦截传递到目标对象的事件,则实现监控目标对象事件作用。通过事件过滤器可以监控其他组件接收到的相关事件,QObject对象都可以作为事件过滤来应用。事件过滤器在组建之前接收到事件,才能决定是否将事件转发至某个对象。

  1. 创建一个事件过滤器对象,并实现 QObject::eventFilter() 方法来处理需要过滤的事件。该方法的参数包括被过滤对象、事件类型和事件对象。
  2. 将事件过滤器对象安装到需要被过滤的对象上,通过调用 QObject::installEventFilter() 方法即可注册事件过滤器。
  3. 在事件过滤器中,根据需要处理或修改被过滤事件的信息,并返回 true 表示事件已被处理,否则返回 false 表示事件未被处理并继续传递给原有对象进行处理。
  4. 在使用事件过滤器时,应该避免修改或删除事件对象,以免影响到事件后续的处理。并且,在事件过滤器中处理的事件应该尽量精简,以免影响程序的性能。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>

/*
此类独立硬件图像表示形式,此图像表示形式可以直接访问像素数据,并且可以用来绘图设备。
Qt提供4个类处理图像数据:QImage/QPixmap/QBitmap/QPicture。
*/
#include <QImage>
#include <QMouseEvent>
#include <QEvent>

// 此类提供水平或垂直排列相关部件
#include <QBoxLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;

private:
    QLabel *label1jpg;
    QLabel *label2jpg;
    QLabel *label3jpg;
    QLabel *labeldispinfo;
    QImage image1jpg;
    QImage image2jpg;
    QImage image3jpg;

public slots:
    bool eventFilter(QObject*,QEvent*);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    setWindowTitle("Qt事件过滤器--测试程序");

    // 展示图片
    label1jpg=new QLabel;
    image1jpg.load("d:/a.jpg");
    label1jpg->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label1jpg->setPixmap(QPixmap::fromImage(image1jpg));

    label2jpg=new QLabel;
    image2jpg.load("d:/b.jpg");
    label2jpg->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label2jpg->setPixmap(QPixmap::fromImage(image2jpg));

    label3jpg=new QLabel;
    image3jpg.load("d:/c.jpg");
    label3jpg->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label3jpg->setPixmap(QPixmap::fromImage(image3jpg));

    // UI布局
    labeldispinfo=new QLabel("鼠标按键提示信息!");
    labeldispinfo->setAlignment(Qt::AlignHCenter); //AlignCenter窗口中心对齐

    QHBoxLayout *hlayout=new QHBoxLayout;
    hlayout->addWidget(label1jpg);
    hlayout->addWidget(label2jpg);
    hlayout->addWidget(label3jpg);

    QWidget *wgt=new QWidget(this);
    QVBoxLayout *vlayout=new QVBoxLayout(wgt);
    vlayout->addLayout(hlayout);
    vlayout->addWidget(labeldispinfo);

    setCentralWidget(wgt); // 中心窗口部件

    // 安装事件过滤
    label1jpg->installEventFilter(this);
    label2jpg->installEventFilter(this);
    label3jpg->installEventFilter(this);
}

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

 bool MainWindow::eventFilter(QObject *watched,QEvent *event) // 事件过滤
 {
     if(watched==label1jpg)
     {
         if(event->type()==QEvent::MouseButtonPress)// 鼠标按键,发生在窗户区域
         {
             QMouseEvent *mevent=(QMouseEvent*)event;
             if(mevent->buttons() & Qt::LeftButton)
             {
                 labeldispinfo->setText("鼠标左键被按下:[左边图片]");
             }
             else if(mevent->buttons() & Qt::MidButton)
             {
                 labeldispinfo->setText("鼠标中键被按下:[左边图片]");
             }
             else if(mevent->buttons() & Qt::RightButton)
             {
                 labeldispinfo->setText("鼠标右键被按下:[左边图片]");
             }

             QMatrix matrix;
             matrix.scale(2,2);
             QImage tempimage=image1jpg.transformed(matrix);
             label1jpg->setPixmap(QPixmap::fromImage(tempimage));
         }

         if(event->type()==QEvent::MouseButtonRelease) // 鼠标释放
         {
             labeldispinfo->setText("鼠标按键已经释放:[左边图片]");
             label1jpg->setPixmap(QPixmap::fromImage(image1jpg));
         }
     }
     else if(watched==label2jpg)
     {
         if(event->type()==QEvent::MouseButtonPress)// 鼠标按键,发生在窗户区域
         {
             QMouseEvent *mevent=(QMouseEvent*)event;
             if(mevent->buttons() & Qt::LeftButton)
             {
                 labeldispinfo->setText("鼠标左键被按下:[中间图片]");
             }
             else if(mevent->buttons() & Qt::MidButton)
             {
                 labeldispinfo->setText("鼠标中键被按下:[中间图片]");
             }
             else if(mevent->buttons() & Qt::RightButton)
             {
                 labeldispinfo->setText("鼠标右键被按下:[中间图片]");
             }

             QMatrix matrix;
             matrix.scale(2.5,2.5);
             QImage tempimage=image2jpg.transformed(matrix);
             label2jpg->setPixmap(QPixmap::fromImage(tempimage));
         }

         if(event->type()==QEvent::MouseButtonRelease) // 鼠标释放
         {
             labeldispinfo->setText("鼠标按键已经释放:[中间图片]");
             label2jpg->setPixmap(QPixmap::fromImage(image2jpg));
         }
     }
     else if(watched==label3jpg)
     {
         if(event->type()==QEvent::MouseButtonPress)// 鼠标按键,发生在窗户区域
         {
             QMouseEvent *mevent=(QMouseEvent*)event;
             if(mevent->buttons() & Qt::LeftButton)
             {
                 labeldispinfo->setText("鼠标左键被按下:[右边图片]");
             }
             else if(mevent->buttons() & Qt::MidButton)
             {
                 labeldispinfo->setText("鼠标中键被按下:[右边图片]");
             }
             else if(mevent->buttons() & Qt::RightButton)
             {
                 labeldispinfo->setText("鼠标右键被按下:[右边图片]");
             }

             QMatrix matrix;
             matrix.scale(3,3);
             QImage tempimage=image3jpg.transformed(matrix);
             label3jpg->setPixmap(QPixmap::fromImage(tempimage));
         }

         if(event->type()==QEvent::MouseButtonRelease) // 鼠标释放
         {
             labeldispinfo->setText("鼠标按键已经释放:[右边图片]");
             label3jpg->setPixmap(QPixmap::fromImage(image3jpg));
         }
     }
     return QMainWindow::eventFilter(watched,event);
 }

void QObject::removeEventFilter(QObject* obj); //删除事件过滤器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值