Domanda

AM creando un'applicazione QT che consiste in una vista ad albero e una WebView.Quando si fa clic su un elemento da una vista ad albero, dovrebbe caricare l'URL corrispondente. Funziona bene .Quando si fa clic con il pulsante destro del mouse sull'elemento, verrà visualizzato un menu di scelta rapida personalizzato n lo aprirà in una nuova webview. Questo è anche funzionante .Ma il mio problema è quando sto facendo clic con il pulsante destro del mouse sull'elemento TreeView, il menu di scelta rapida viene visualizzato e se lo fai clic su di esso al di fuori del menu pop-up L'URL di tale voce viene caricata.Come risolvere questo .. Aiutami gli amici ..

Ecco la mia codifica:

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

}
.

È stato utile?

Soluzione

Per quello che so, la situazione che descrivi è standard con menu contestuali in Views: Quando fai clic con il tasto destro del mouse, viene selezionato l'elemento.

Se si desidera un altro comportamento, è necessario implementare il mousePressEvent e implementare il comportamento che si desidera ottenere.

Ecco un suggerimento:

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ì, devi ricavare la classe QTreeView e creare uno dei tuoi.

Ho fatto questo tempo fa, e lo ricordo come il punto di partenza.Non ricordo ora se dovessi reimplementare tutti e quattro gli eventi di base del mouse: premi, rilascia, muovi e doubleclick, poiché sono correlati internamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top