Насколько потокобезопасным и латентным является QApplication :: mouseButtons? - PullRequest
0 голосов
/ 20 ноября 2011

Когда вы получаете сигнал мыши от модели в ваш слот, передается аргумент QModelIndex.

QModelIndex не сообщает вам, какая кнопка нажата. Итак, мы можем прибегнуть к QApplication :: mouseButtons. Но QApplication :: mouseButtons - это текущее нажатие кнопки, а не когда модель нажала.

Мой мысленный эксперимент говорит, что после нажатия правой кнопки основной вид посылает сигнал моему виджету, но незадолго до того, как слот моего виджета получил сигнал, произошел ложный щелчок левой кнопкой мыши. Поэтому вызов QApplication :: mouseButtons при получении QModelIndex будет ошибочно ассоциировать строку, по которой щелкают, левой кнопкой мыши, а не правой кнопкой. Насколько возможен этот сценарий?

Когда вы смотрите на Qt и даже на QML, для получения правильной информации о кнопках мыши при получении QModelIndex требуется много акробатики кода. Это политика, которую nokia стремится продвигать агностицизм кнопки мыши?

1 Ответ

3 голосов
/ 20 ноября 2011

Я не думаю, что это очень вероятный сценарий, но это может произойти.

«Простой» способ убедиться в том, какая кнопка была нажата, - это создать подкласс QTableView (или используемое представление и переопределить mouseReleaseEvent.

void mouseReleaseEvent(QMouseEvent * event)
{
    // store the button that was clicked
    mButton = event->button();
    // Now call the parent's event
    QTableView::mouseReleaseEvent(event);
}

По умолчанию mouseReleaseEvent испускает сигнал clicked, если нажата позиция вида

Если пользователь нажимает мышь внутри вашего виджета, а затем перетаскивает мыши в другое место, прежде чем отпустить кнопку мыши, ваш Виджет получает событие выпуска. Функция будет излучать сигнал clicked (), если элемент был нажат.

Хитрость заключается в том, чтобы поймать сигнал clicked в вашем производном классе и подать новый сигнал, который кроме модельного индекса будет также содержать кнопку.

// Define your new signal in the header
signals:
    void clicked(QModelIndex, Qt::MouseButton);

// and a slot that will emit it
private slots:
    void clickedSlot(QModelIndex); 

// In the constructor of your derived class connect the default clicked with a slot 
connect(this, SIGNAL(clicked(QModelIndex), this, SLOT(clickedSlot(QModelIndex)));

// Now the slot just emits the new clicked signal with the button that was pressed
void clickedSlot(QModelIndex i)
{
    emit clicked(i, mButton);
}

Вы можете сделать что-то похожее с mousePressEvent, если вам также нужен сигнал pressed.

...