2012-05-22 4 views
1

Создает приложение Qt, которое состоит из дерева и веб-представления. при щелчке элемента из древовидного изображения он должен загрузить соответствующий URL-адрес. Работает отлично. когда щелкните правой кнопкой мыши на элементе, появится пользовательское контекстное меню, и оно откроет его в новом веб-обзоре. Это также работает. Но моя проблема в том, когда я нажимаю правой кнопкой мыши на элементе 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.Fèlix Galindo Allué ... –

Смежные вопросы