赞
踩
ui->label->setText("<u>日期</u>");
在解决问题过程中出现的曲折,做出了单击跳出对话框,但是意外发现点击其他区域也跳转,过程首先在,h中定义了一个clicked()信号:
signals:
void clicked();
同时,声明了一个槽函数:
private slots:
void slotclicked();
主函数中:
void MainWindow::slotclicked()
{
QMessageBox::information(NULL,QString::fromLocal8Bit("点击"),QString::fromLocal8Bit("牛逼吗?"),QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
}
在保护成员函数中定义:
protected:
void mousePressEvent(QMouseEvent *event);
主函数中写了函数:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
emit clicked();
}
}
信号槽连接:
connect(this,SIGNAL(clicked()),this,SLOT(slotclicked()));
运行代码,出现界面点击实现单击消息框,但是当我点击其他地方时,一下子发现点击界面也出现消息框,这就问题来了。
思考了一会儿,仔细将代码分析一遍终于,所谓的单击label事件事实上操作的是鼠标事件,检测鼠标事件,但检测到鼠标事件时跳出消息框。这就一下子勾起我的好奇心了,我该怎么解决呢??
经过查询了帮助文档和一些资料,确定使用鼠标双击事件
void Q3ScrollView::mouseDoubleClickEvent ( QMouseEvent * e ) [virtual protected]
Reimplemented from QWidget::mouseDoubleClickEvent().
接上面函数写:
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
if(!rect().contains(event->pos()))
return;
if(event->button()==Qt::LeftButton)
{
emit clicked();
}
}
虽然实现单击界面不跳出对话框,但是这种仍然是检测鼠标事件,不完美!!!
分析:点击鼠标弹出事件是正确的思路,但是没有过滤掉其他界面单击事件即没有指定控件弹出事件,Object有这样的一函数,事件过滤:
virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
|
因此,需要在鼠标事件外层嵌套一层,操作代码如下:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(obj == ui->label)//需要操作label
{
if(event->type() == QEvent::MouseButtonPress)//判断事件类型
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if(mouseEvent->button() == Qt::LeftButton)
{
QMessageBox::information(NULL,QString::fromLocal8Bit("点击"),QString::fromLocal8Bit("牛逼吗?"),QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
return true;
}
return false;
}
return false;
}
return QMainWindow::eventFilter(obj, event);
}
重写了eventFilter函数后,还
需要
安装过滤器需要调用
QObject::installEventFilter()
函数
ui->label->setText("<u>耗子</u>");
ui->label->installEventFilter(this);//安装事件过滤
运行结果成功,效果图如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。