文件属性
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类 ,它主要用于捕获和处理用户通过鼠标进行的交互操作,例如点击、移动、释放鼠标按钮等。
button()
:返回一个枚举类型Qt::MouseButton
,表示触发事件的鼠标按钮类型。buttons()
:返回一个枚举类型Qt::MouseButtons
,表示当前鼠标按下的所有按钮。pos()
:返回一个QPoint
对象,表示鼠标事件发生时的坐标位置。globalPos()
:返回一个QPoint
对象,表示鼠标事件发生时的全局坐标位置。modifiers()
:返回一个枚举类型Qt::KeyboardModifiers
,表示事件发生时的键盘修饰符状态。x()
和y()
:分别返回事件发生时的 x 坐标和 y 坐标。globalX()
和globalY()
:分别返回事件发生时的全局 x 坐标和全局 y 坐标。accept()
和ignore()
:用于接受或忽略该事件,可以控制事件的传递和处理。- 重写事件处理函数(如
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
常用的属性和方法:
key()
:返回一个枚举类型Qt::Key
,表示触发事件的按键键值。modifiers()
:返回一个枚举类型Qt::KeyboardModifiers
,表示事件发生时的键盘修饰符状态。text()
:返回一个字符串,表示按下按键对应的字符,考虑到键盘布局和输入法的影响。isAutoRepeat()
:返回一个布尔值,表示按键事件是否为自动重复(长按)事件。accept()
和ignore()
:用于接受或忽略该事件,可以控制事件的传递和处理。- 重写事件处理函数(如
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对象都可以作为事件过滤来应用。事件过滤器在组建之前接收到事件,才能决定是否将事件转发至某个对象。
- 创建一个事件过滤器对象,并实现
QObject::eventFilter()
方法来处理需要过滤的事件。该方法的参数包括被过滤对象、事件类型和事件对象。- 将事件过滤器对象安装到需要被过滤的对象上,通过调用
QObject::installEventFilter()
方法即可注册事件过滤器。- 在事件过滤器中,根据需要处理或修改被过滤事件的信息,并返回
true
表示事件已被处理,否则返回false
表示事件未被处理并继续传递给原有对象进行处理。- 在使用事件过滤器时,应该避免修改或删除事件对象,以免影响到事件后续的处理。并且,在事件过滤器中处理的事件应该尽量精简,以免影响程序的性能。
#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); //删除事件过滤器