我有一个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){.....}
答案 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::MouseButtons
是QFlags
类型。您无法使用==
运算符对其进行测试。使用&
运算符进行测试:
if(QApplication::mouseButtons() & Qt:LeftButton) {
...
}