2012-05-22 6 views
1

트리보기와 웹보기로 구성된 Qt 응용 프로그램을 작성 중입니다. 트리 뷰의 항목을 클릭하면 해당 URL이로드됩니다. 작동합니다. Fine입니다. 항목을 마우스 오른쪽 버튼으로 클릭하면 사용자 정의 컨텍스트 메뉴가 나타납니다. 그러면 새 웹보기에서 열립니다. 이 또한 작동합니다. 하지만 내 문제는 언제 내 컨텍스트 메뉴에서 treeview 항목을 마우스 오른쪽 단추로 클릭하고 팝업 메뉴 바깥 쪽을 클릭하면 해당 항목의 URL이로드됩니다. 어떻게이 문제를 해결하기 위해 .. 나에게 친구를 도와주세요 .. 여기 Qt 사용자 정의 컨텍스트 메뉴

내 코드입니다 : 내가 알고있는 것을 들어

QStandardItem *rootItem   = new QStandardItem("Google"); 
    QStandardItem *stackItem  = new QStandardItem("Stack Overflow"); 
    QStandardItem *yahooItem  = new QStandardItem("Yahoo"); 

    rootItem->appendRow(stackItem); 
    standardModel->appendRow(rootItem); 
    standardModel->appendRow(yahooItem); 

***// private slot for loading the url if a treeview item is clicked:*** 

void MainWindow::treeViewClicked(const QModelIndex &index) 
{ 
    str = index.data().toString(); 

    if(!(str.isEmpty()) && str=="Google") 
    { 
     url = "http://www.google.com"; 
    } 

    else if (!(str.isEmpty()) && str == "stack Overflow") 
    { 
     url = "http://www.stackoverflow.com"; 
    } 

    else if (!(str.isEmpty()) && str == "Yahoo") 
    { 
     url = "http://www.yahoo.com"; 
    } 

    WebView *wv = dynamic_cast<WebView *>(ui->tabWidget->currentWidget()); 
    wv->load(QUrl(url)); 
    ui->tabWidget->setTabText(ui->tabWidget->currentIndex(),str); 

    treeView->setModel(standardModel); 

**//Creating custom context menu for QtreeView:** 

void MainWindow::showContextMenu(const QPoint& point) 
{ 
    QList<QAction *> actions; 
    if(treeView->indexAt(point).isValid()) 
    { 
     actions.append(m_treeViewAction); 
    } 

    else if(actions.count() > 0) 
    { 
     QMenu::exec(actions, MainWindow::treeView->mapToGlobal(point)); 
     QModelIndex index = treeView->indexAt(point); 
     QStandardItem *item = standardModel->itemFromIndex(index); 
     treeView->setCurrentIndex(index); 
     treeViewClicked(index); 
    } 

} 

답변

3

, 당신이 설명하는 상황이 뷰의 컨텍스트 메뉴와 표준 : 당신은 마우스 오른쪽 버튼을 클릭하면, 항목 또한 선택됩니다.

다른 동작을 원할 경우 mousePressEvent을 구현하고 달성하려는 동작을 구현해야합니다.

void MyTreeView::mousePressEvent (QMouseEvent * event) 
{ 
    if (event->button() == Qt::LeftButton) { 
     // set the current item based on event->pos()/deselect if no item 
    } 
    else if (event->button() == Qt::RightButton) { 
     // show context menu for the item/different context menu if no item 
    } 
} 

예, 당신은 QTreeView 클래스를 파생하고 자신의 일을해야합니다 : 여기

는 힌트입니다.

나는 오래 전에 이것을 해왔다. 나는 이것을 출발점으로 생각한다. 네 가지 기본 마우스 이벤트를 모두 다시 구현해야한다면 지금은 기억이 안납니다 : 내부적으로 관련되어있는 것처럼 누르기, 놓기, 이동 및 더블 클릭.

+0

감사합니다 Mr.Felix Galindo Allué ... –

관련 문제