Question

Je crée une application Qt composée d'une arborescence et d'une vue Web.lorsque l'on clique sur un élément d'une arborescence, il doit charger l'URL correspondante. Ça fonctionne bien.lorsque je fais un clic droit sur l'élément, un menu contextuel personnalisé apparaîtra et l'ouvrira dans une nouvelle vue Web. Cela fonctionne aussi.Mais mon problème est que lorsque je clique avec le bouton droit sur l'élément d'arborescence, mon menu contextuel apparaît et si je clique dessus en dehors du menu contextuel, l'URL de cet élément est chargée.comment résoudre ça..Aidez-moi les amis..

Voici mon codage :

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

}
Était-ce utile?

La solution

Pour ce que je sais, la situation que vous décrivez est standard avec les menus contextuels dans les vues :Lorsque vous faites un clic droit, l'élément est également sélectionné.

Si vous souhaitez un autre comportement, vous devez implémenter le mousePressEvent et mettez en œuvre le comportement que vous souhaitez atteindre.

Voici un indice :

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

Oui, vous devez dériver la classe QTreeView et en créer une vous-même.

Je l'ai fait il y a longtemps et je m'en souviens comme du point de départ.Je ne me souviens plus si je devais réimplémenter les quatre événements de base de la souris :appuyez, relâchez, déplacez et double-cliquez, car ils sont liés en interne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top