Frage

Ich erstelle eine Qt-Anwendung, die aus einer Baumansicht und einer Webansicht besteht.Wenn in einer Baumansicht auf ein Element geklickt wird, sollte die entsprechende URL geladen werden. Es funktioniert gut.Wenn ich mit der rechten Maustaste auf das Element klicke, erscheint ein benutzerdefiniertes Kontextmenü, das es in einer neuen Webansicht öffnet. Das funktioniert auch.Aber mein Problem ist, wenn ich mit der rechten Maustaste auf das Baumansichtselement klicke, erscheint mein Kontextmenü und wenn ich außerhalb des Popup-Menüs darauf klicke, wird die URL dieses Elements geladen.wie man das löst..Helft mir, Freunde..

Hier ist meine Codierung:

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

}
War es hilfreich?

Lösung

Soweit ich weiß, ist die von Ihnen beschriebene Situation Standard bei Kontextmenüs in Ansichten:Wenn Sie mit der rechten Maustaste klicken, wird das Element ebenfalls ausgewählt.

Wenn Sie ein anderes Verhalten wünschen, müssen Sie das implementieren mousePressEvent und implementieren Sie das Verhalten, das Sie erreichen möchten.

Hier ein Hinweis:

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

Ja, Sie müssen die QTreeView-Klasse ableiten und eine eigene erstellen.

Ich habe das schon vor langer Zeit gemacht, und ich erinnere mich, dass dies der Ausgangspunkt war.Ich kann mich jetzt nicht erinnern, ob ich alle vier grundlegenden Mausereignisse neu implementieren musste:Drücken, Loslassen, Bewegen und Doppelklicken, da sie intern zusammenhängen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top