Pregunta

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, se debe cargar la URL correspondiente. Funciona bien.Cuando hago clic 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 que cuando hago clic derecho en el elemento de la vista de árbol aparece mi menú contextual y si hago clic fuera del menú emergente, se carga la URL de ese elemento.como solucionar esto..Ayúdenme 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);
    }

}
¿Fue útil?

Solución

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

Si quieres otro comportamiento, debes 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:presione, suelte, mueva y haga doble clic, ya que están relacionados internamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top