2010-01-25 25 views
5

que estoy trabajando en un proyecto uni y nuestro objetivo es hacer un programa que escanea todos los archivos img/vídeo/película en un directorio seleccionado, los almacena en una base de datos y luego los shozs de una manera organizada (usando QTreeWidgetItem). El programa le permite hacer algunas cosas como leer los archivos, abrirlos, etc. Ahora, el problema es que me gustaría hacer clic con el botón derecho en uno de los archivos y abrir un menú con muchas opciones como Abrir el directorio, eliminar el archivo ...que desea implementar menús Haga clic derecho sobre QTWidgetItems

Simplemente no sé cómo hacer ese clic derecho en el menú, soy un poco nuevo a QT, he intentado hacer esto:

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

me trataron redifining el método itemClicked pero parece que no puede encontrar la manera de saber si se trata de un clic derecho y creo que podría estar tratando de que la Sentido Contrario.

me inspiró de esto:

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

que ejecuta un archivo de música en el doble clic.

Si necesita más partes de código, hágamelo saber :).

Edición después el último comentario de Andy para mostrar nuevo código:

#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); 
}  

Incluso si quito el QTreeWidget * = treeWidget nueva QTreeWidget(); línea no funcionará, veo el menú cuando hago clic con el botón derecho pero cuando hago clic en Hacer, no pasa nada.

Respuesta

9

En la clase QWidget, usted puede encontrar un método llamado:

void setContextMenuPolicy (Qt::ContextMenuPolicy policy) 

Con el parámetro: (. Puede configurar por código o en el QtDesigner) Qt :: ActionsContextMenu

Entonces a continuación, puede crear un QMenu así:

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

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

es agradable de usar esto porque se puede volver a utilizar sus acciones en otros menús, por ejemplo, en el menú principal de la ventana ...

Espero que ayude un poco!

+0

¡Hola! ¡Gracias por su respuesta! ¿Y dónde debería definir pOpenFile? supongo que tendré que poner el mismo código que tengo en opennMusic (QTreeWidgetItem *, int) (excepto que no tengo los parámetros, entonces: /) Aunque en su mayoría solo necesito abrir un menú donde Puedo hacer clic en Abrir directorio objetivo utilizando la ruta de acceso almacenada en la base de datos, lamentablemente, a menos que esté equivocado, QT solo le permite buscar y seleccionar archivos de directorios, pero en realidad no los abre: /. – magnus

+0

Erm, sugeriría crear un método openFile que escanea el árbol, buscando el SelectedItem. Luego, dependiendo de los elementos seleccionados, puede obtener con toda seguridad su "ruta" ... Entonces, crearía el OpenFile en su ventana principal, (supongo que es el padre de su treewidget) ... Cuando se desencadena la acción (haga clic derecho en el menú, acceso directo o cualquier cosa) puede escanear en busca de elementos seleccionados y realiza el comportamiento correcto ... Una vez que tenga los elementos seleccionados, esto puede ayudarlo (supongo que usa QDirModel): QSirding QDirModel :: filePath (const QModelIndex & index) const –

+0

ok, haga clic con el botón derecho del menú usando el código que me dio. Parece que esta atm: treeWidget = new QTreeWidget(); QAction * pOpenFile = new QAction (tr ("Open repertory"), treeWidget); treewidget-> setContextMenuPolicy (Qt :: ActionsContextMenu); treeWidget-> addAction (pOpenFile); connect (pOpenFile, SIGNAL (itemClicked (QTreeWidgetItem *, int)), esto, SLOT (opennMusic (QTreeWidgetItem *, int))); Como puede ver, es importante que podamos extraer un Elemento QTreeWidget * para reproducir el archivo. y la conexión que ponemos no funciona. Espero que nos puedas ayudar de nuevo y gracias de nuevo por todos !! – magnus

1

Hay un controlador de eventos para exactamente el mismo caso: QWidget::contextMenuEvent. Además del hecho de que no es necesario comprobar la clave específica del mouse, también tiene la ventaja de que esto permite al usuario crear el menú contextual usando el teclado, o tal vez usar una forma totalmente diferente, si el usuario está trabajando en una plataforma donde los menús contextuales se solicitan por otros medios.

1

También podría tener un rápido vistazo a la siguiente Qt Ejemplo: http://qt.nokia.com/doc/4.6/phonon-qmusicplayer.html.

No hay ningún árbol aquí, pero tal vez deberías tratar de analizar seriamente cómo inicializan la ventana, cómo construyen el QTableWidget y lo rellena y cómo usan señales/ranuras.

Yo también lo recomendaría a darle una prueba de este ejemplo. Tome su código fuente e intente modificarlo para agregar el clic derecho ... De la misma manera que lo haría con su árbol ... Cuando lo haya hecho funcionar perfectamente, verá que le tomará 23 segundos pasar de Widget de Tabla a árbol ...

Vamos a saber si usted tiene menos problemas con este ejemplo ...

Editar: Después de poner algo de código ...

1) lireMusique tiene un parámetro de columna que no se usa nunca.
2) item-> text (6) devuelve un QString que no puede ser NULL. elemento, puede ser NULO, por lo tanto, si lo está, se bloqueará cada vez que ingrese el método si no prueba el elemento! = NULL.
3) En vueArtiste, ¿por qué eliminas y vuelves a crear tu Widget? Tal vez extraño algún código pero ...
4) Su método pOpenDir es extraño ... Lo llamaría enActOpenDirectoryTriggered(). ¿Está conectado correctamente a la señal de disparo de tu acción pOpenDir?
5) ¿Por qué crear un nuevo QTreeWidget cada vez que activa su acción? ¡Su nuevo árbol tiene el mismo nombre que TreeWidget var en vueArtiste! Esas dos variables no tienen el mismo alcance, ¡pero tienen el mismo nombre! ¡Es una receta para el desastre!

...

yo realmente sugiero que lea uno o dos modelo/vista por ejemplo, Qt, que son sencillas, bien hecho y que le ayudará mucho!

También te sugiero que sigas estrictas convenciones de nombres, te ayudarán a evitar muchos errores y situaciones molestas ... También evitaría mezclar idiomas en el código (olvida el francés, usa el inglés en todas partes) ... En ¡otras palabras, intenta ser más constante en tu código!

Por último, dado que pareces ser un hablante nativo de francés, te recomendaría leer un libro de Qt4, como this book (1st in french, 2nd in english). Empecé con este, ¡le dará todo lo que necesita y mucho más!

Cuestiones relacionadas