Я хочу реализовать меню правой кнопки на QTWidgetItems

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

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

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

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

Я вдохновил от этого:

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

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

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

Редактирование после последнего комментария andy, который покажет новый код:

#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 = новый QTreeWidget (); выровняйте его работа привычки, я вижу меню, когда я щелкаю правой кнопкой, но когда я нажимаю PLay, ничего не происходит.

5
задан BЈовић 1 July 2013 в 06:31
поделиться

3 ответа

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

void setContextMenuPolicy (Qt::ContextMenuPolicy policy) 

с параметром: Qt :: ActionContextMenu (вы можете либо установить его по коду или в Qtdesigner.)

Тогда вы можете создать qMenu, как это:

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

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

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

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

9
ответ дан 13 December 2019 в 19:27
поделиться

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

1
ответ дан 13 December 2019 в 19:27
поделиться

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

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

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

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

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

1) Liremusique имеет параметр столбца, который никогда не используется.
2) Элемент-> Текст (6) возвращает QString, который не может быть нулевым. Элемент, может быть нуль, поэтому, если оно есть, вы будете падать каждый раз, когда вы вводите метод, если вы не тестируете элемент! = NULL.
3) В Vueartiste вы удаляете и воссоздаете свой виджет? Я, может быть, пропустить какой-код, но ...
4) Ваш метод popedir странный ... Я бы назвал его онактундеректиректригурированным (). Это правильно связано с сигналом триггерного действия вашего PopeDir?
5) Зачем создавать новый Qtreewidget каждый раз, когда вы запускаете свое действие? Ваше новое дерево имеет то же имя, что и VreeWidget var в Vueartiste! Эти две переменные не имеют такой же области, но одинаковое имя! Это рецепт стихийных бедствий!

...

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

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

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

1
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: