2010-04-19 4 views
4

나는 호출되는 다음 코드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()와 QTreeView 항목에서 상황에 맞는 메뉴를 구현하고 난 컨텍스트 메뉴를 볼 수 있습니다.

문맥 메뉴는 사용자가 항목을 마우스 오른쪽 버튼으로 클릭하고 선택한 항목에 따라 사용자 정의해야하는 경우에만 표시되어야합니다.

QPoint 정보에서/어떤 항목을 선택했는지 어떻게 알 수 있습니까? Qt 4.5.3입니다.

+0

나는 MyDerivedQAbstractItemModel :: getItem (MyDerivedQTreeView-> currentIndex())을 시도했다. 항목을 마우스 오른쪽 단추로 클릭하지 않아도 기본적으로 첫 번째 항목을 반환합니다. QTreeView에서 빈 공간을 클릭하더라도 항상 항목을 반환합니다. – vinaym

답변

12

사용자 정의 메뉴를 구성하기 전에 QTreeView의 indexAt() 메서드를 사용하여 클릭 한 항목을 가져올 수 있습니다.

+1

감사합니다. 이 작동합니다. getItem (MyDerivedQTreeView-> indexAt (point))은 NULL이 아닌 항목을 반환하지만 유효한 항목인지 찾기 위해 항목에 설정된 속성을 쿼리 할 수 ​​있습니다. 다시 한번 감사드립니다. – vinaym

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

0

QTreeWidget::currentItem() 함수는 마우스 오른쪽 버튼으로 클릭 한 항목을 반환합니다. 그것은 설명에 기초하여 그렇게하는 것이 분명하지 않지만, 나의 사용법에 근거하여 그것이하는 일입니다.

관련 문제