如何避免鼠标单击一个小部件触发 Qt 中其他小部件的信号?
Posted
技术标签:
【中文标题】如何避免鼠标单击一个小部件触发 Qt 中其他小部件的信号?【英文标题】:How to avoid mouse click on one widget triggering the signals in others in Qt? 【发布时间】:2013-11-30 17:04:41 【问题描述】:在我的应用程序中,我使用 QTableView 显示图像列表,然后通过单击鼠标左键并按下控制键盘按钮来选择一些图像,应用程序看起来如下图所示:@987654321 @
但是当我尝试使用应用程序上的其他按钮(如 “Destination”)然后尝试选择目标文件夹时,应用程序如下所示:
当我单击“选择文件夹”按钮并尝试选择文件夹时出现问题。发生的情况是单击文件夹选择选项卡,触发 QTableView 小部件,我在其中显示图像并取消选择所有选定的图像。我想避免它。我现在跟踪鼠标左键单击 QTableView 小部件的方式如下:
bool MainWindow::eventFilter(QObject* obj, QEvent *ev)
if(obj == ui->listOfImages->viewport())
QMouseEvent * mouseEv = static_cast<QMouseEvent*>(ev);
if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true))
controlButtonCounter++;
fetch = true;
return QObject::eventFilter(obj,ev);
else if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == false))
if(selectedImages.size()>0)
ui->listOfImages->clearSelection();
selectedImages.clear();
fetch = false;
controlButtonCounter = 0;
return QObject::eventFilter(obj,ev);
这里的ui->listOfImages
是QTableView 小部件。 controlButtonCounter
之类的其他内容与单击鼠标无关,我将其用于其他目的。
请告诉我,当我按下与 QTableView 位于同一区域的其他东西时,如何避免触发 QTableView 小部件。
【问题讨论】:
【参考方案1】:if(obj = ui->listOfImages->viewport())
您没有在此处进行比较,而是为obj
变量赋值。
应该是这样的:
if(obj == ui->listOfImages->viewport())
【讨论】:
是的,我编辑了它,我也在我的代码中更改了它,这只是我的眼睛和注意力的疏忽,不过感谢您的通知。即使纠正这个错误也没有改变任何东西。 @the_naive 您还应该在将event type 转换为鼠标事件之前检查它是否实际上是mouse press/release event。 感谢您的信息,但从文档中我看到它是GraphicsSceneMousePress
,这意味着它用于图形场景类型对象,对吧?它适用于 QTableView 类型的对象吗?这可能是一个愚蠢的问题,但我很困惑。我想我应该使用MouseButtonPress
,对吧?
谢谢,显然它正在工作。如果我有任何进一步的问题,我会回来找你的 :)。
@the_naive QGraphicsSceneMouseEvent
s 仅供图形视图框架使用。【参考方案2】:
我不确定,但也许它可以帮助你:
void setWindowModality(Qt::WindowModality windowModality)
此属性保存模式窗口小部件阻止了哪些窗口。
此属性仅对 Windows 有意义。模态小部件可防止其他窗口中的小部件获得输入。此属性的值控制在小部件可见时阻止哪些窗口。在窗口可见时更改此属性无效;您必须先
hide()
小部件,然后再show()
。默认情况下,此属性为
Qt::NonModal
。
【讨论】:
不,即使那样它也不起作用,输入一些如何达到事件功能。 @the_naive,试试这个方法void setAttribute (Qt::WidgetAttribute attribute, bool on = true)
属性Qt::WA_NoMousePropagation
(或maby Qt::WA_TransparentForMouseEvents
,Qt::WA_NoMouseReplay
)以上是关于如何避免鼠标单击一个小部件触发 Qt 中其他小部件的信号?的主要内容,如果未能解决你的问题,请参考以下文章