5

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

我只是不知道如何制作那个右键菜单,我对 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(); 行它不起作用,我右键单击时看到菜单,但是当我单击播放时,没有任何反应。

4

3 回答 3

9

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

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

希望它有点帮助!

于 2010-01-25T16:43:42.423 回答
1

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

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

我还建议您从这个示例中对其进行测试。获取他们的源代码,并尝试修改它以添加右键单击...就像您对树所做的那样...当您让它完美工作时,您会看到它需要 23 秒才能通过它从表到树小部件...

让我们知道你是否对这个例子有更少的麻烦......

编辑:在你放一些代码之后......

1) lireMusique 有一个从未使用过的列参数。
2) item->text(6) 返回一个不能为 NULL 的 QString。item,可以为NULL,所以如果是NULL,如果不测试item,每次进入方法都会崩溃!=NULL。
3)在 vueArtiste 中,为什么要删除并重新创建 Widget ?我可能错过了一些代码,但是...
4)您的方法 pOpenDir 很奇怪...我将其命名为 onActOpenDirectoryTriggered()。它是否正确连接到您的 pOpenDir 动作的触发信号?
5)为什么每次触发动作时都创建一个新的 QTreeWidget ?您的新树与 vueArtiste 中的 treeWidget var 同名!这两个变量的作用域不同,但名称相同!这是灾难的秘诀!

...

我真的建议您阅读 Qt 的一两个模型/视图示例,它们简单明了,做得很好,对您有很大帮助!

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

最后,由于您似乎是法语母语人士,我建议您阅读 Qt4 书籍,例如这本书(法语第 1,英语第 2)。我从这个开始,它将提供您需要的一切以及更多!

于 2010-01-28T11:15:46.080 回答
1

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

于 2010-01-25T16:45:22.793 回答