如何在QTreeView项目中查找从customContextMenuRequested()中选择的项目?
问题描述:
我已经实现上下文菜单中QTreeView则项目用下面的代码如何在QTreeView项目中查找从customContextMenuRequested()中选择的项目?
MyDerivedQTreeView->setModel(MyDerivedQAbstractItemModel);
MyDerivedQTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(MyDerivedQTreeView,
SIGNAL(customContextMenuRequested(const QPoint &)),
MyDerivedQAbstractItemModel(),
SLOT(contextualMenu(const QPoint &)));
void MyDerivedQAbstractItemModel::contextualMenu(const QPoint& point)
{
QMenu *menu = new QMenu;
menu->addAction(QString("Test Item"), this, SLOT(test_slot()));
menu->exec(MyDerivedQTreeView->mapToGlobal(point));
}
MyDerivedQAbstractItemModel :: contextualMenu()被调用,我可以看到上下文菜单。
问题是上下文菜单应仅在用户右键单击某个项目时可见,并且应根据所选项目进行自定义。
如何获取是否从QPoint信息中选择哪个项目?我在Qt 4.5.3上。
答
也许这个代码将帮助您:
==> dialog.h < ==
QStandardItemModel *model;
QSortFilterProxyModel *proxyModel;
QTreeView *treeView;
==> dialog.cpp < ==
void CImportTabWidget::createGUI() {
...
proxyModel = new QSortFilterProxyModel;
proxyModel->setDynamicSortFilter(true);
treeView = new QTreeView;
treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
treeView->setRootIsDecorated(false);
treeView->setAlternatingRowColors(true);
treeView->setModel(proxyModel);
model = new QStandardItemModel(0, 4);
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Comment"));
model->setHeaderData(2, Qt::Horizontal, tr("Size"));
model->setHeaderData(3, Qt::Horizontal, tr("Date"));
fillTreeViewData();
proxyModel->setSourceModel(model);
...
}
//////////////////////////////////////////////////////////////////////////
void CImportTabWidget::createMenus() {
treeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(treeView,
SIGNAL(customContextMenuRequested(const QPoint &)),
this,
SLOT(contextMenu(const QPoint &)));
}
//////////////////////////////////////////////////////////////////////////
void CImportTabWidget::contextMenu(const QPoint &widgetXY) {
Q_UNUSED(widgetXY);
QMenu menu(this);
/* Условия для меню */
deleteAct->setEnabled((!model->rowCount()) ? false : true);
deleteAllAct->setEnabled((!model->rowCount()) ? false : true);
/* Находим индекс */
QModelIndex index = treeView->currentIndex();
QString fileName = model->data(model->index(index.row(), 0)).toString();
if (!fileName.isEmpty()) {
importAct->setText(tr("Import %1").arg(fileName));
//deleteAct->setText(tr("Delete %1").arg(fileName));
}
/* Формируем меню */
menu.addAction(deleteAct);
menu.addAction(deleteAllAct);
menu.exec(QCursor::pos());
}
祝你好运!
+0
正如我所提到的,treeView-> currentIndex()每次都会返回一个有效的ModelIndex。 indexAt()按我需要工作。无论如何感谢您的回应。 – vinaym 2010-04-19 10:37:40
我试过MyDerivedQAbstractItemModel :: getItem(MyDerivedQTreeView-> currentIndex())。它默认返回第一个项目,即使我没有右键单击某个项目。它总是返回一个项目,即使我点击QTreeView中的任何空白空间。 – vinaym 2010-04-19 09:45:24