2010-04-19 60 views
4

我已經實現上下文菜單中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

回答

12

也許你可以使用QTreeView的indexAt()方法來獲取點擊的項目,然後再構建自定義菜單。

+1

謝謝。這工作。 儘管getItem(MyDerivedQTreeView-> indexAt(point))返回一個非NULL項目,我可以查詢項目上設置的屬性以查找它是否爲有效項目。 再次感謝。 – vinaym 2010-04-19 10:35:33

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()); 
} 

祝你好運!

+0

正如我所提到的,treeView-> currentIndex()每次都會返回一個有效的ModelIndex。 indexAt()按我需要工作。無論如何感謝您的迴應。 – vinaym 2010-04-19 10:37:40

0

QTreeWidget::currentItem()函數返回右鍵單擊的項目。目前尚不清楚它是基於描述做到的,但基於我對它的使用,它就是這樣做的。

相關問題