如何在“点击”插槽中使用QApplication :: mouseButtons()告诉鼠标按钮?

时间:2010-06-22 04:00:51

标签: qt qt4 signals-slots right-click mouseclick-event

我有一个QMainWindow,并希望处理来自其中较小的小部件(例如tableview)的“clicked”信号。

最初我将信号连接到此QMainWindow的插槽,这是最常用的方法。 现在我需要告诉单击哪个鼠标按钮,并为左右按钮执行不同的操作,我发现“点击”信号没有鼠标事件信息。

我试图实现“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)
     {
        ......
     }
}

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

for“connect”使用此:

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)              
 {              
    ......              
 }
}

答案 2 :(得分:-2)

Qt::MouseButtonsQFlags类型。您无法使用==运算符对其进行测试。使用&运算符进行测试:

if(QApplication::mouseButtons() & Qt:LeftButton) {
...
}