如何避免鼠标单击一个小部件触发 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-&gt;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 QGraphicsSceneMouseEvents 仅供图形视图框架使用。【参考方案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_TransparentForMouseEventsQt::WA_NoMouseReplay

以上是关于如何避免鼠标单击一个小部件触发 Qt 中其他小部件的信号?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?

Qt 的鼠标事件

其他非 qt 窗口顶部的 Qt 小部件

如何将鼠标点击信号连接到 pyqtgraph 绘图小部件

如何在 Qt 层次结构的根小部件中获取鼠标按下事件

使用 Qt,如何使用向上或向左的鼠标移动事件调整小部件的大小