2010-01-25 4 views
5

Pracuję nad projektem uni, a naszym celem jest stworzenie programu, który skanuje wszystkie pliki img/wideo/filmów w wybranym katalogu, przechowuje je w bazie danych, a następnie przesuwa je w zorganizowany sposób (przy użyciu QTreeWidgetItem). Program pozwala na robienie takich rzeczy, jak czytanie plików, otwieranie ich i tak dalej. Problem polega na tym, że chciałbym kliknąć prawym przyciskiem myszy jeden z plików i wyświetlić menu z wieloma opcjami, takimi jak Otwórz katalog, usuń plik ...Chcę zaimplementować menu prawego przycisku myszy na QTWidgetItems

Po prostu nie wiem, jak zrobić menu z prawym przyciskiem myszy, Jestem trochę nowych do QT, próbowałem czyniąc to:

connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(openMenu(QTreeWidgetItem *, int))); 

próbowałem redifining metodę itemClicked ale nie wydaje się znaleźć sposób, aby wiedzieć, czy jest to prawy przycisk myszy i myślę, że mogę próbować go z zła droga.

I inspirowane z tego:

connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(opennMusic(QTreeWidgetItem *, int))); 

który wykonuje plik muzyczny na podwójnym kliknięciem.

Jeśli potrzebujesz więcej części kodu, daj mi znać :).

Edit po ostatnim komentarzu Andy, aby pokazać nowy kod:

#include "affichagemusique.h" 




    void AffichageMusique::lireMusique(QTreeWidgetItem *item, int column) 
{ 

    if(item->text(6)!=NULL) 
    { 
    Phonon::MediaSource source(item->text(6)); 
    mediaObject->setCurrentSource(source); 
    mediaObject->play(); 
    } 
}  


    void AffichageMusique::vueArtiste() 
{ 

    layout->removeWidget(treeWidget); 
    treeWidget = new QTreeWidget(); 
    QAction* pOpenDir = new QAction(tr("Play music"),treeWidget); 
    treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu); 
    treeWidget->addAction(pOpenDir); 

....... 

}  
// later on on the code 

    void AffichageMusique::pOpenDir() 
{ 

    QTreeWidget * treeWidget = new QTreeWidget(); 
    QTreeWidgetItem * QTreeWidgetI= treeWidget->currentItem(); 
    lireMusique(QTreeWidgetI, 6); 
}  

Nawet jeśli usunąć QTreeWidget * treeWidget = new QTreeWidget(); linia nie będzie działać, widzę menu po kliknięciu prawym przyciskiem myszy, ale kiedy klikam PLAY, nic się nie dzieje.

Odpowiedz

9

W klasie QWidget można znaleźć metodę o nazwie:

void setContextMenuPolicy (Qt::ContextMenuPolicy policy) 

Z parametru: (. Można też ustawić go za pomocą kodu lub w QtDesigner) Qt :: ActionsContextMenu

Następnie można następnie utworzyć QMenu tak:

QTreeWidget* pTreeWidget = new QTreeWidget(); 
QAction* pOpenFile = new QAction(tr("Open A File"), pContextMenu); 

pTreeWidget->setContextMenuPolicy(Qt::ActionsContextMenu); 
pTreeWidget->addAction(pTestCard); 

miło używać tego powodu można ponownie wykorzystać swoje działania w innych menu, na przykład, w głównym menu okna ...

Mam nadzieję, że to trochę pomaga!

+0

Witam! Dziękuję za Twoją odpowiedź! I gdzie powinienem zdefiniować pOpenFile? Przypuszczam, że będę musiał umieścić w nim ten sam kod, który mam w opennMusic (QTreeWidgetItem *, int) (z wyjątkiem tego, że nie mam parametrów: /) Mimo że w większości przypadków potrzebuję tylko otworzyć menu, gdzie Mogę kliknąć na Open Target Directory, używając ścieżki zapisanej w bazie danych, niestety, o ile się nie mylę, QT pozwala tylko przeglądać i wybierać pliki z katalogów, ale ich nie otwiera: /. – magnus

+0

Erm, proponuję utworzyć metodę openFile, która skanuje drzewo, szukając SelectedItem. Następnie, w zależności od wybranych elementów, możesz uzyskać na pewno ich "ścieżkę" ... Tak więc, utworzyłbym OpenFile w twoim głównym oknie, (przypuszczam, że to rodzic twojego treewidget) ... Kiedy akcja zostanie wywołana (kliknij prawym przyciskiem myszy menu, skrót lub cokolwiek), możesz skanować wybrane elementy i wykonać odpowiednie zachowanie ... Po wybraniu elementów, może ci to pomóc (prawdopodobnie używam QDirModel): QString QDirModel :: filePath (const QModelIndex & index) const –

+0

ok menu z prawym przyciskiem myszy, używając kodu, który mi dałeś. Wygląda jak ten bankomat: treeWidget = new QTreeWidget(); QAction * pOpenFile = new QAction (tr ("Open repertory"), treeWidget); treewidget-> setContextMenuPolicy (Qt :: ActionsContextMenu); treeWidget-> addAction (pOpenFile); connect (pOpenFile, SIGNAL (itemClicked (QTreeWidgetItem *, int)), to, SLOT (opennMusic (QTreeWidgetItem *, int))); Jak widać, ważne jest, że możemy wyodrębnić element QTreeWidget * w celu odtworzenia pliku. a połączenie, które umieściliśmy, nie działa. Mam nadzieję, że pomożecie nam jeszcze raz i jeszcze raz dziękujemy! – magnus

1

W tym przypadku dostępna jest procedura obsługi zdarzeń: QWidget::contextMenuEvent. Poza faktem, że nie musisz sprawdzać konkretnego klawisza myszy, ma również tę zaletę, że umożliwia to użytkownikowi tworzenie menu kontekstowego za pomocą klawiatury, lub może używać zupełnie innego sposobu, jeśli użytkownik pracuje na platformie, na której wymagane są menu kontekstowe za pomocą innych środków.

1

Można również rzucić okiem na następującą Qt Przykład: http://qt.nokia.com/doc/4.6/phonon-qmusicplayer.html.

Nie ma tu drzewa, ale może powinieneś spróbować i poważnie spojrzeć na sposób inicjalizacji okna, jak budować QTableWidget i zapełniać go oraz jak używają sygnałów/gniazd.

Polecam również, aby dać mu test z tego przykładu. Weź kod źródłowy i spróbuj go zmodyfikować, aby dodać właściwe kliknięcie ... W ten sam sposób, w jaki zrobiłbyś to dla swojego drzewa ... Gdy wszystko działa idealnie, zobaczysz, że zajmie ci to 23 sekundy z Widoku od stołu do drzewa ...

Daj nam znać, jeśli masz mniej problemów z tym przykładzie ...

Edycja: Po umieszczeniu kodu ...

1) lireMusique ma parametr kolumny, które nigdy nie jest używany.
2) pozycja-> tekst (6) zwraca QString, który nie może mieć wartości NULL. item, może mieć wartość NULL, więc jeśli tak, to zawiesisz się za każdym razem, gdy wpiszesz metodę, jeśli nie przetestujesz elementu! = NULL.
3) Dlaczego w vueArtiste usuwasz i ponownie tworzysz widget? Może brakuje mi jakiegoś kodu, ale ...
4) Twoja metoda pOpenDir jest dziwna ... Nazwałbym ją na ActOpenDirectoryTriggered(). Czy jest prawidłowo podłączony do sygnału wyzwalającego działanie pOpenDir?
5) Po co tworzyć nową QTreeWidget za każdym razem, gdy uruchamiasz akcję? Twoje nowe drzewo ma taką samą nazwę jak zmienna treeWidget w vueArtiste! Te dwie zmienne nie mają tego samego zakresu, ale mają tę samą nazwę! To przepis na katastrofę!

...

Chciałbym naprawdę zalecamy, aby przeczytać jeden lub dwa modelu/Widok przykład przez Qt, są one proste, ładnie wykonane i będzie Ci dużo!

Proponuję również przestrzegać ścisłych konwencji nazewnictwa, pomogą ci uniknąć wielu błędów i irytujących sytuacji ... Unikałbym również mieszania języków w kodzie (zapomnij o języku francuskim, używaj angielskiego wszędzie) ... In inne słowa, spróbuj i bądź bardziej stały w swoim kodzie!

Wreszcie, ponieważ wydajesz się być native speakerem francuskim, polecam przeczytać książkę Qt4, np. this book (1st in french, 2nd in english). Zacząłem od tego, to da wszystko, czego potrzebujesz i wiele więcej!