如何在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上。

+0

我试过MyDerivedQAbstractItemModel :: getItem(MyDerivedQTreeView-> currentIndex())。它默认返回第一个项目,即使我没有右键单击某个项目。它总是返回一个项目,即使我点击QTreeView中的任何空白空间。 – vinaym 2010-04-19 09:45:24

也许你可以使用QTreeView的indexAt()方法来获取点击的项目,然后再构建自定义菜单。

+1

谢谢。这工作。 尽管getItem(MyDerivedQTreeView-> indexAt(point))返回一个非NULL项目,我可以查询项目上设置的属性以查找它是否为有效项目。 再次感谢。 – vinaym 2010-04-19 10:35:33

也许这个代码将帮助您:

==> 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

QTreeWidget::currentItem()函数返回右键单击的项目。目前尚不清楚它是基于描述做到的,但基于我对它的使用,它就是这样做的。