Я хочу реализовать меню правой кнопки мыши на QTWidgetItems - PullRequest
5 голосов
/ 25 января 2010

Я работаю над унифицированным проектом, и наша цель - создать программу, которая сканирует все файлы img / video / movie в выбранном каталоге, сохраняет их в базе данных и затем организовывает их шо (используя QTreeWidgetItem). Программа позволяет делать такие вещи, как чтение файлов, их открытие и так далее. Теперь проблема в том, что я хотел бы щелкнуть правой кнопкой мыши по одному из файлов и открыть меню со многими параметрами, такими как Открыть каталог, удалить файл ...

Я просто не знаю, как сделать это меню правой кнопкой мыши, я новичок в QT, я пытался сделать это:

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

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

Я вдохновился этим:

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

, который выполняет музыкальный файл при двойном щелчке.

Если вам нужно больше частей кода, просто дайте мне знать:).

Редактировать после последнего комментария Энди, чтобы показать новый код:

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

Даже если я удалю QTreeWidget * treeWidget = new QTreeWidget (); Если это не работает, я вижу меню, когда я щелкаю правой кнопкой мыши, но когда я нажимаю кнопку PLAY, ничего не происходит.

Ответы [ 3 ]

9 голосов
/ 25 января 2010

В классе QWidget вы можете найти метод с именем:

void setContextMenuPolicy (Qt::ContextMenuPolicy policy) 

С параметром: Qt :: ActionsContextMenu (Вы можете установить его по коду или в QtDesigner.)

Затем вы можете создать QMenu следующим образом:

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

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

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

Надеюсь, это немного поможет!

1 голос
/ 28 января 2010

Вы также можете быстро взглянуть на следующий пример Qt: http://qt.nokia.com/doc/4.6/phonon-qmusicplayer.html.

Здесь нет дерева, но, возможно, вам следует серьезно подумать о том, как они инициализируют окно, как они создают QTableWidget и заполняют его, и как они используют сигналы / слоты.

Я бы также порекомендовал вам провести тест из этого примера. Возьмите их исходный код и попробуйте изменить его, добавив правый клик ... Точно так же, как вы сделали бы это для своего дерева ... Когда вы получите его для идеальной работы, вы увидите, что пройдет 23 секунды это от таблицы к дереву виджет ...

Дайте нам знать, если у вас меньше проблем с этим примером ...

Редактировать: после того, как вы введете код ...

1) lireMusique имеет параметр столбца, который никогда не используется.
2) item-> text (6) возвращает QString, которая не может быть NULL. item, может иметь значение NULL, поэтому, если это так, вы будете падать каждый раз, когда вводите метод, если не тестируете item! = NULL.
3) В vueArtiste, почему вы удаляете и воссоздаете свой виджет? Я, возможно, скучаю по коду, но ...
4) Ваш метод pOpenDir странный ... Я бы назвал его на ActOpenDirectoryTriggered (). Правильно ли он подключен к сигналу запуска вашего действия pOpenDir?
5) Зачем создавать новый QTreeWidget каждый раз, когда вы запускаете свое действие? Ваше новое дерево имеет то же имя, что и treeWidget var в vueArtiste! Эти две переменные не имеют одинаковую область видимости, но имеют одинаковое имя! Это рецепт катастрофы!

...

Я бы действительно посоветовал вам прочитать один или два примера модели / вида от Qt, они просты, хорошо сделаны, и это вам очень поможет!

Я бы также посоветовал вам следовать строгим соглашениям об именах, они помогут вам избежать множества ошибок и неприятных ситуаций ... Я бы также избегал смешивать языки в коде (забудьте французский, везде используйте английский) ... В других словами, постарайся быть более постоянным в своем коде!

Наконец, поскольку вы, кажется, являетесь носителем французского языка, я бы рекомендовал прочитать книгу Qt4, например эту книгу (1-я по-французски, 2-я по-английски) . Я начал с этого, он даст все, что вам нужно и многое другое!

1 голос
/ 25 января 2010

Для этого случая есть обработчик событий: QWidget::contextMenuEvent. Помимо того факта, что вам не нужно проверять конкретную клавишу мыши, она также имеет то преимущество, что она позволяет пользователю создавать контекстное меню с помощью клавиатуры или, возможно, использовать совершенно другой способ, если пользователь работает на платформе, где контекстные меню запрашиваются другими способами.

...