سؤال

أقوم بإنشاء تطبيق Qt الذي يتكون من عرض الشجرة وعرض الويب.عند النقر على عنصر من العرض الشجري، يجب تحميل عنوان URL المقابل. أنه يعمل بشكل جيد.عندما أقوم بالنقر بزر الماوس الأيمن على العنصر، ستظهر قائمة سياقات مخصصة وستفتحها في عرض ويب جديد. وهذا يعمل أيضا.لكن مشكلتي هي عندما أقوم بالنقر بزر الماوس الأيمن على عنصر عرض الشجرة، تأتي قائمة السياق الخاصة بي وإذا قمت بالنقر فوقها خارج القائمة المنبثقة، فسيتم تحميل عنوان url الخاص بهذا العنصر.كيفية حل هذا..ساعدوني يا أصدقاء..

هذا هو الترميز الخاص بي:

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

}
هل كانت مفيدة؟

المحلول

على حد علمي، فإن الموقف الذي تصفه قياسي مع وجود قوائم السياق في طرق العرض:عند النقر بزر الماوس الأيمن، يتم تحديد العنصر أيضًا.

إذا كنت تريد سلوكًا آخر، فيجب عليك تنفيذ mousePressEvent وتنفيذ السلوك الذي تريد تحقيقه.

هنا تلميح:

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

نعم، يجب عليك اشتقاق فئة QTreeView وإنشاء واحدة خاصة بك.

لقد فعلت هذا منذ وقت طويل، وأتذكر هذا كنقطة البداية.لا أتذكر الآن ما إذا كان علي إعادة تنفيذ جميع أحداث الماوس الأربعة الأساسية:اضغط، وحرّر، وحرك، وانقر نقرًا مزدوجًا، لأنها مرتبطة داخليًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top