我想在QTWidgetItems上实现右键菜单

mag*_*nus 5 qt right-click

我正在开发一个uni项目,我们的目标是制作一个程序,扫描所选目录上的所有img/video/movie文件,将它们存储在数据库中,然后以有条理的方式(使用QTreeWidgetItem)进行翻译.程序允许你做一些事情,如读取文件,打开它们等等.现在,问题是我想右键单击其中一个文件并弹出一个菜单,其中包含许多选项,如Open Directory,删除文件......

我只是不知道如何制作正确的点击菜单,我是QT的新手,我试过这个:

connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(openMenu(QTreeWidgetItem *, int)));
Run Code Online (Sandbox Code Playgroud)

我尝试重新设计itemClicked方法,但似乎无法找到如何知道它是否是一个右键单击,我想我可能会以错误的方式尝试它.

我从中受到启发:

connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(opennMusic(QTreeWidgetItem *, int)));
Run Code Online (Sandbox Code Playgroud)

它会在双击时执行音乐文件.

如果您需要更多代码部分,请告诉我:).

编辑完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);
}    
Run Code Online (Sandbox Code Playgroud)

即使我删除了QTreeWidget*treeWidget = new QTreeWidget(); 它不会工作,当我点击右键时看到菜单但是当我点击PLay时,没有任何反应.

And*_*y M 9

在QWidget类中,您可以找到一个名为的方法:

void setContextMenuPolicy (Qt::ContextMenuPolicy policy) 
Run Code Online (Sandbox Code Playgroud)

使用参数:Qt :: ActionsContextMenu(您可以通过代码或QtDesigner设置它.)

然后你可以像这样创建一个QMenu:

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

pTreeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
pTreeWidget->addAction(pTestCard);
Run Code Online (Sandbox Code Playgroud)

使用它很好,因为您可以在其他菜单中重复使用您的操作,例如,在主窗口菜单中...

希望它有点帮助!