如何在QTreeView项目中找到从customContextMenuRequested()中选择的项目?

时间:2010-04-19 09:18:03

标签: qt qt4

我已使用以下代码

在QTreeView项目中实现了上下文菜单
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。

3 个答案:

答案 0 :(得分:13)

在构建自定义菜单之前,也许您可​​以使用QTreeView的indexAt()方法获取点击的项目。

答案 1 :(得分:2)

也许这段代码可以帮到你:

==> 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());
}
祝你好运!

答案 2 :(得分:0)

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