Menú contextual personalizado de Qt

Estoy creando una aplicación Qt que consta de una vista de árbol y una vista web. cuando se hace clic en un elemento de una vista de árbol, debe cargar la URL correspondiente. Funciona bien. cuando haga clic con el botón derecho en el elemento, aparecerá un menú contextual personalizado y lo abrirá en una nueva vista web. Esto también está funcionando. Pero mi problema es cuando estoy haciendo clic con el botón derecho en el elemento de vista de árbol, aparece mi menú contextual y si estoy haciendo clic fuera del menú emergente, se carga la URL de ese elemento. como solucionar esto.. ayudenme amigos..

Aquí está mi codificación:

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

}

preguntado el 22 de mayo de 12 a las 08:05

1 Respuestas

Por lo que sé, la situación que describe es estándar con los menús contextuales en las vistas: cuando hace clic con el botón derecho, también se selecciona el elemento.

Si desea otro comportamiento, debe implementar el mousePressEvent e implementar el comportamiento que desea lograr.

Aquí hay una pista:

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
     }
}

Sí, debe derivar la clase QTreeView y crear una propia.

Lo hice hace mucho tiempo, y lo recuerdo como el punto de partida. Ahora no recuerdo si tuve que volver a implementar los cuatro eventos básicos del mouse: presionar, soltar, mover y hacer doble clic, ya que están relacionados internamente.

contestado el 22 de mayo de 12 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.