Zastąpiłem contentsMousePressEvent w moim widoku listy w ten sposób.

void AppListView::contentsMousePressEvent(QMouseEvent *e)
{
    AppGenericListView::contentsMousePressEvent(e);
    if (e->button() == Qt::RightButton)
        emit rightClicked();
    emit multiSelection();
}

Oto mój keyPressEvent.

void AppListView::keyPressEvent(QKeyEvent * e)
{
    AppGenericListView::keyPressEvent(e);
    if ((e->key() == Qt::Key_Up) || (e->key() == Qt::Key_Down))
    {
        QListViewItem * item = currentItem();
        if (item)
        {
            const QRect rect = itemRect(item);
            QMouseEvent mEvt(QEvent::MouseButtonPress, rect.center(), Qt::LeftButton, Qt::LeftButton);
            contentsMousePressEvent(&mEvt);
        }
    }
}

Na razie ten kod działa dobrze. Pamiętaj, że nie tworzę dynamicznego obiektu QMouseEvent. Chcę wiedzieć, czy spowoduje to awarię w przyszłości? Czy contentMousePressEvent potrzebuje obiektu dynamicznego? Dokumentacja Qt niewiele o tym mówi. Jakieś pomysły ....

0
shan 24 wrzesień 2012, 11:40

2 odpowiedzi

Najlepsza odpowiedź

Nie ulegnie awarii, ponieważ nie używasz pętli zdarzeń. Ale myślę, że powinieneś, z dwóch powodów:

  1. Symulujesz zdarzenie naciśnięcia myszy, ale nie podajesz go obiektowi jako takiemu. Na przykład nie wyświetlasz fałszywego zdarzenia myszy na mousePressEvent(). Tak więc w przypadku „naturalnych” zdarzeń naciśnięcia myszy i symulowanego, aplikacja będzie zachowywać się inaczej. I możesz zapomnieć, dlaczego tak się dzieje, i możesz dostać niewytłumaczalne awarie, gdy twój kod ewoluuje.

  2. Oryginalna obsługa zdarzenia naciśnięcia klawisza systemowego zostanie zablokowana przez obsługę zdarzenia naciśnięcia myszy. Nie możesz wiedzieć kto (jaki wątek) będzie connect() wysyłał twoje sygnały z nadpisanego programu obsługi zdarzeń myszy. Nie zdziw się, jeśli pojawi się impas.

Takie na wpół upieczone skróty są dobre tylko jako tymczasowe rozwiązania. Na dłuższą metę będą strzelać w plecy. Jeśli naprawdę potrzebujesz skrótu, przestań udawać, że jest to zdarzenie myszy i zaimplementuj specjalną osobną metodę, która będzie wywoływana również z „prawdziwego” zdarzenia myszy. Jeśli chcesz, aby prawdziwe zdarzenie myszy było obsługiwane prawidłowo, utwórz dynamiczne QMouseEvent i umieść je w kolejce w pętli zdarzeń.

QMouseEvent* evt = new QMouseEvent(QEvent::MouseButtonPress,
  rect.center(),this->mapToGlobal(rect.center()),
 Qt::LeftButton, Qt::LeftButton);
QCoreApplication::postEvent(this,evt);
1
Pavel Zdenek 24 wrzesień 2012, 18:15

Programy obsługi zdarzeń nie przejmują na własność otrzymanych zdarzeń. Więc twój obecny kod jest w porządku.

Zostałby usunięty automatycznie (i spowodowałby awarię), jeśli przesłałbyś go do QCoreApplication::postEvent do wysłania asynchronicznie.

1
alexisdm 24 wrzesień 2012, 17:46