上一篇文章介绍QTabWidget的使用技巧。本文开始介绍Qt最常用的事件之一QMouseEvent。
鼠标事件 mousePressEvent
鼠标事件是Qt中十分重要的人机交互形式。鼠标事件包括很多内容,此处先介绍最基本的mousePressEvent事件函数。如前期文章所示,Qt中的大部分事件函数都已经提供了函数接口,我们只需要在具体项目类中对这些事件函数进行具体实现即可。
打开Qt的widget帮助文档,可以找到mousePressEvent的函数定义如下所示:
mousePressEvent是一个虚函数,通过在子类之中对其进行实现来关联具体的鼠标动作。第一步需要在mainWindow中定义一个mousePressEvent(QMouseEvent *event),注意虚函数的形参类型不能修改,只能是QMouseEvent *,函数定义时后面加上override表示对虚函数进行重新实现。
Cpp之中对mousePressEvent进行实现。
void mainWindow::mousePressEvent(QMouseEvent *event)
{
return QMainWindow::mousePressEvent(event); //将事件操作权返回给父类
}
在事件之中添加一个简单的打印输出,event事件对象,此处输出鼠标在界面的位置pos(),pos函数给出的是窗口坐标系下的位置而不是桌面坐标下的位置,此函数是比较重要的鼠标事件函数,用于定位鼠标位置:
qDebug()<<"mouse clicked "<<event->pos();
编译运行代码,在界面随便点击鼠标,不论是点击左中右键都会输出一条信息:
如果我们只希望捕获鼠标左键点击事件,那么在事件处理函数中使用如下的代码过滤掉其他鼠标键输入。button()函数输出鼠标点击的键值。此时再点击鼠标右键或者中键不会有反应。
if(event->button()==Qt::LeftButton)
{
qDebug()<<"mouse clicked "<<event->pos();
}
下面给鼠标动作加一些复杂的动作,我们先在ui的tab_2添加一个居中的tableWidget,命名为mouseControlTable:
此时table是一个空的表格,我们先给表格添加两列:
下面通过数表动作来动态为表格修改行数,假设点击鼠标左键我们为表格增加一行,点击鼠标右键为表格删除一行。
void mainWindow::mousePressEvent(QMouseEvent *event)
{
int tableRowCount = ui->mouseControlTable->rowCount();
if(event->button()==Qt::LeftButton)
{
ui->mouseControlTable->insertRow(tableRowCount);
}
if(event->button()==Qt::RightButton)
{
if(tableRowCount) ui->mouseControlTable->setRowCount(tableRowCount-1);
}
return QMainWindow::mousePressEvent(event); //将时间操作权返回给主函数
}
此时在界面上如果点击左键,表格会动态增加一行,如果点击右键,表格会动态减少一行。
不过有心的您会发现,当您点击表格区域时,什么动作都不会发生。 那是因为QTableWidget本身就有自己的mouseEvent虚函数,我们并没有对其进行定义。为了实现在表格上点击鼠标操作(如复制粘贴等动作),我们需要对表格类QTableWidget进行继承开发新类,并书写mouseEvent方法,然后将ui中拉入QTableWidget控件提升为自己开发的新类型。 这些将在下一篇帖子进行介绍。
欢迎同好沟通交流,批评指正,欢迎关注我的公号:不如起而行之