我正在研究一个UNI项目,我们的目标是制定一个程序,在选定目录上扫描所有IMG/视频/电影文件,将它们存储在数据库中,然后以有条理的方式(使用QTREEWIDGETITEM)将其存储在数据库中。程序使您可以做一些事情,例如阅读文件,打开它们等。现在,问题是我想右键单击一个文件,并弹出一个菜单,其中包含许多选项,例如Open Directory,Delete File ...

我只是不知道如何制作右键单击菜单,我有点是QT的新手,我尝试做到这一点:

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

我尝试重新列出了该项目的方法,但似乎找不到如何知道它是否是右键单击,我认为我可能会以错误的方式尝试。

我从中启发了:

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 = new qtreewidget();行线无法正常工作,当我右键单击时,我会看到菜单,但是当我单击播放时,什么也不会发生。

有帮助吗?

解决方案

在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);

很高兴使用此功能,因为您可以在其他菜单中重新使用操作,例如在主窗口菜单中...

希望它有所帮助!

其他提示

有一个针对这种情况的事件处理程序: QWidget::contextMenuEvent. 。除了您不必检查特定鼠标键的事实外,它还具有使用户能够使用键盘创建上下文菜单的优势,或者如果用户正在工作,则可以使用完全不同的方式来创建上下文菜单。在通过其他方式请求上下文菜单的平台上。

您还可以快速查看以下QT示例: http://qt.nokia.com/doc/4.6/phonon-qmusicplayer.html.

这里没有树,但是也许您应该尝试认真看一下它们如何初始化窗口,如何构建QTableWidget并将其填充它以及如何使用信号/插槽。

我还建议您从此示例中进行测试。采用他们的源代码,然后尝试对其进行修改以添加右键...与您的树相同的方式...当您使其完美工作时,您会看到它需要23秒才能通过它从桌子到树小部件...

让我们知道如果您在这个示例上有很少的麻烦...

编辑:放入一些代码后...

1)LiRemusique具有从未使用的列参数。
2)item-> text(6)返回无法为空的QString。项目,可以为null,因此,如果您不测试项目!= null,则每次输入该方法时都会崩溃。
3)在Vueartiste,为什么要删除并重新创建小部件?我也许错过了一些代码,但是...
4)您的方法Popendir很奇怪...我会将其命名为OnactopendirectoryTriggered()。它是否正确连接到Popendir Action的触发信号?
5)为什么每次触发操作都会创建一个新的Qtreewidget?您的新树具有与Vueartiste中的Treewidget Var相同的名称!这两个变量没有相同的范围,但名称相同!这是灾难的秘诀!

...

我真的建议您阅读QT的一两个模型/查看示例,它们很简单,做得很好,这将对您有很大帮助!

我还建议您遵循严格的命名惯例,它们将帮助您避免很多错误和令人讨厌的情况...我还会避免在代码中混合语言(忘记法语,到处使用英语)...换句话说,请尝试并在代码中更加稳定!

最后,由于您似乎是法国母语者,我建议您阅读一本QT4书,例如 这本书(第一个法语,第二英语). 。我从这件事开始,它将提供您需要的一切等等!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top