题
我正在研究一个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书,例如 这本书(第一个法语,第二英语). 。我从这件事开始,它将提供您需要的一切等等!