Как указать кнопку мыши с помощью QApplication :: mouseButtons () в слоте «щелчка»? - PullRequest
0 голосов
/ 22 июня 2010

У меня есть QMainWindow, и я хочу обработать сигнал "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)
     {
        ......
     }
}

Когда я пытаюсь это сделать, ни одно из двух утверждений if не будет удовлетворено, я не знаю почему.qApp-> mouseButtons () всегда возвращает 0, как я могу получить нажатую кнопку мыши с помощью QApplication :: mouseButtons?

В моем коде слот выглядит так:

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

Ответы [ 3 ]

3 голосов
/ 22 июня 2010

Вы получаете 0, потому что нажатие испускается после отпускания мыши, а не при нажатии мыши.Чего ты хочешь достичь?Может быть, попробовать настройки вашего виджета contextMenuPolicy для пользовательских, а затем подключиться к сигналу contextMenuRequested (для правого клика) и щелкнуть для левого клика?

1 голос
/ 18 июля 2010

для «подключения» используйте это:

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)              
 {              
    ......              
 }
}
0 голосов
/ 22 июня 2010

Qt::MouseButtons - это тип QFlags. Вы не можете проверить это с оператором ==. Для проверки используйте оператор &:

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