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 ....
2 odpowiedzi
Nie ulegnie awarii, ponieważ nie używasz pętli zdarzeń. Ale myślę, że powinieneś, z dwóch powodów:
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.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);
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.
Podobne pytania
Nowe pytania
qt
Qt to wieloplatformowa platforma programistyczna szeroko stosowana do tworzenia aplikacji, które można uruchamiać na różnych platformach programowych i sprzętowych z niewielką lub żadną zmianą w podstawowej bazie kodu, a jednocześnie mają moc i szybkość aplikacji natywnych. Qt jest dostępny z licencjami komercyjnymi i open source.