我正在开发一个uni项目,我们的目标是制作一个程序,扫描所选目录上的所有img / video / movie文件,将它们存储在数据库中,然后以有条理的方式(使用QTreeWidgetItem)对它们进行反映。程序允许你做一些事情,如读取文件,打开它们等等。现在,问题是我想右键单击其中一个文件并弹出一个菜单,其中包含许多选项,如Open Directory,删除文件......
我只是不知道如何制作右键菜单,我是QT的新手,我尝试过这样做:
connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(openMenu(QTreeWidgetItem *, int)));
我尝试重新设计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 = new QTreeWidget();它不会工作,当我点击右键时我会看到菜单但是当我点击PLay时,没有任何反应。
答案 0 :(得分: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);
使用它很好,因为您可以在其他菜单中重复使用您的操作,例如,在主窗口菜单中...
希望它有所帮助!
答案 1 :(得分:1)
对于这种情况,有一个事件处理程序:QWidget::contextMenuEvent
。除了您不必检查特定鼠标键之外,它还具有以下优点:这使用户能够使用键盘创建上下文菜单,或者如果用户正在工作则可以使用完全不同的方式在通过其他方式请求上下文菜单的平台上。
答案 2 :(得分:1)
您还可以快速查看以下Qt示例:http://qt.nokia.com/doc/4.6/phonon-qmusicplayer.html。
这里没有树,但也许您应该尝试认真看看它们如何初始化窗口,如何构建QTableWidget并填充它以及它们如何使用信号/插槽。
我还建议你从这个例子中给它一个测试。获取他们的源代码,并尝试修改它以添加正确的单击...就像你为你的树做的一样...当你完美地工作时,你会看到你需要23秒才能通过它从表到树Widget ......
如果您对此示例的麻烦较少,请告诉我们......
编辑:你输入一些代码后......
1)lireMusique有一个从未使用过的列参数
2)item-> text(6)返回一个不能为NULL的QString。 item,可以为NULL,如果是,如果你没有测试项目,每次进入方法都会崩溃!= NULL。
3)在vueArtiste中,为什么要删除并重新创建Widget?我可能会错过一些代码但是......
4)你的方法pOpenDir很奇怪...我会在ActOpenDirectoryTriggered()上命名它。它是否正确连接到您的pOpenDir动作的触发信号?
5)为什么每次触发动作时都要创建一个新的QTreeWidget?您的新树与vueArtiste中的treeWidget var具有相同的名称!这两个变量的范围不同,但名称相同!这是灾难的秘诀!
...
我真的建议你阅读Qt的一个或两个模型/视图示例,它们很简单,做得很好,它会对你有所帮助!
我还建议您遵循严格的命名约定,它们将帮助您避免许多错误和恼人的情况...我也会避免在代码中混合语言(忘记法语,到处使用英语)...在其他单词,尝试并在代码中更加稳定!
最后,既然你似乎是法语母语人士,我建议你阅读Qt4书籍,如this book (1st in french, 2nd in english)。我从这个开始,它将提供你需要的一切以及更多!