0

我有一个 QMainWindow,并且想要处理来自其中的较小小部件(例如 tableview)的“点击”信号。

最初我将信号连接到这个 QMainWindow 的一个插槽,这是最常见的方法。现在我需要知道单击了哪个鼠标按钮,并为左右按钮做不同的事情,我发现“clicked”信号没有鼠标事件信息。

我尝试实现“mousePressEvent”功能,但仍然存在一些问题。如果鼠标动作作用于较小的小部件,则 MainWindow 不会进入其 mousePressEvent。

一些文件说我们可以通过 QQApplication::mousebuttons() 告诉按钮

http://bugreports.qt-project.org/browse/QTBUG-1067

我还找到了一些示例代码。但是,这是针对“按下事件”的,但我想为“单击事件”获取鼠标按钮。以下是示例代码:

connect(moduleTree,SIGNAL(itemPressed(QTreeWidgetItem *, int)),this,SLOT(SlotItemClicked(QTreeWidgetItem *, int)));

void CGuiMainwindow::SlotItemClicked(QTreeWidgetItem *item, int column)

{
     if (qApp->mouseButtons() == Qt::LeftButton)
     { return; }

     if (qApp->mouseButtons() == Qt::RightButton)
     {
        ......
     }
}

当我尝试这样做时,两个 if 语句都不会满足,我不知道为什么。qApp->mouseButtons() 总是返回 0,如何通过 QApplication::mouseButtons 获取单击的鼠标按钮?

在我的代码中,插槽看起来像这样:

void clickItem( const QModelIndex & idx){.....}
4

3 回答 3

3

你得到 0 因为 clicked 是在鼠标释放后发出的,而不是在鼠标按下时发出的。你想达到什么目标?也许尝试将您的小部件 contextMenuPolicy 设置为自定义,然后连接到信号 contextMenuRequested(右键单击)并单击左键?

于 2010-06-22T06:32:20.477 回答
1

对于“连接”使用这个:

connect(moduleTree,SIGNAL(itemClicked(QTreeWidgetItem *,int )),this
        ,SLOT(SlotItemClicked(QTreeWidgetItem *, int)));

定义一个全局标志:

public:
Qt::MouseButton mouseClickedBtnFlag;

然后重新实现“mouseReleaseEvent”:

CGuiMainwindow::mouseReleaseEvent ( QMouseEvent * event )
{
mouseClickedBtnFlag = event->button();
}

进而:

void CGuiMainwindow::SlotItemClicked(QTreeWidgetItem *item, int column)
{    
 if (mouseClickedBtnFlag == Qt::LeftButton)              
 { return; }              

 if (mouseClickedBtnFlag == Qt::RightButton)              
 {              
    ......              
 }
}
于 2010-07-18T10:37:28.967 回答
-1

Qt::MouseButtons是一种QFlags类型。您无法使用==操作员对其进行测试。使用&运算符进行测试:

if(QApplication::mouseButtons() & Qt:LeftButton) {
...
}
于 2010-06-22T04:38:01.563 回答