QTDockWidget设置浮动后的QTreeWidget界面显示奇怪现象

Qt5.15.2 Linux 下使用创建一个Widget,Widget中一个QDockWidget,QDockWiget中一个QTreeWidget,在使用QDockWidget的setFloating(false)后,QTreeWidget的hove节点和鼠标位置所在节点不是同一个,在QDockWidget的setFloating(true)后没有该现象出现

初始化QTreeWidget相关代码

void Widget::initTree()
{
    ui->treeWidgetSolution->setHeaderHidden(true);
    // ui->treeWidgetSolution->setRootIsDecorated(false);
    //ui->treeWidgetSolution->setFocusPolicy(Qt::NoFocus);
    //ui->treeWidgetSolution->setMouseTracking(true);

    // ui->treeWidgetSolution->setStyleSheet("QTreeWidget::item{height:75px}");  // 设置QSS——行的高度(行间距)

    ui->treeWidgetSolution->installEventFilter(this);
    ui->treeWidgetSolution->setAttribute(Qt::WA_Hover, true); //开启悬停事件
    ui->treeWidgetSolution->setAlternatingRowColors(true);
    setStyleSheet("QTreeView::item::selected{background-color:green;} QTreeView::item::hover{background-color:blue;}");
    //ui->treeWidgetSolution->viewport()->installEventFilter(this);

    QString soluDispName("cesi11");
    QTreeWidgetItem* parentItem = new QTreeWidgetItem(ui->treeWidgetSolution, QStringList() << soluDispName);
    parentItem->setToolTip(RECENT_TREE_COL, soluDispName);
    ui->treeWidgetSolution->addTopLevelItem(parentItem);

    int index = 0;
    int allSize = 15;
    for(int k = 0; k < 15; k++)
    {
        QString tagName = QString::number(k);
        QString sceneDispName = tagName;
        QTreeWidgetItem* childItem = new QTreeWidgetItem(parentItem, QStringList() << sceneDispName);
        childItem->setToolTip(RECENT_TREE_COL, sceneDispName);
        parentItem->addChild(childItem);

        // 子节点增加上移下移
        CTreeItemWidget* opWidget = new CTreeItemWidget(childItem);
        opWidget->setDelHide();
        opWidget->setIndex(index++, allSize);
        opWidget->setObjectName(sceneDispName);
        ui->treeWidgetSolution->setItemWidget(childItem, 0, opWidget);
    }
    // ui->treeWidgetSolution->collapseAll();
}

QDockWidget setFloating相关代码



void Widget::showWidget(const QWidget* widget)
{
    if(widget == ui->widgetEnterSolu)
    {
        if((!ui->widgetEnterSolu->isLocked()) && (!ui->dockWidget->isWindow()))
        {
            ui->dockWidget->setFloating(!ui->widgetEnterSolu->isLocked());
        }
        else if(ui->widgetEnterSolu->isLocked())
        {
            ui->dockWidget->setFloating(false);
        }

        if(!ui->widgetEnterSolu->isLocked())
        {
            const QRect& lRect = ui->widgetEnter->geometry();
            const QPoint& lGPoint = ui->widgetEnter->mapToGlobal(QPoint(0, 0));
            ui->dockWidget->move(lGPoint.x() + lRect.width(), lGPoint.y());
            ui->dockWidget->setFixedHeight(lRect.height());
        }

        ui->dockWidget->show();
        qDebug() << "##cc## show widget " << ui->dockWidget->geometry() << ui->dockWidget->isVisible();
    }
}

程序运行效果图片

img

请各位不吝赐教

在setFloating后,将QDOckWidget重新添加到原有的布局中,该现象消息,具体原因不知道,使用该方法本人的问题解决

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: QT常见界面设计组件——QTreeWidget和QDockWidget中的 实例概述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    此实例主要介绍QTreeWidget、QDockWidget的使用,以及用QLabel显示图片的方法,实例主要使用QTreeWidget,创建一个照片管理器,实例运行界面效果如下:

    此实例的主窗口是从QMainWindow继承而来,主要演示了下面几个组件的使用:

    • QTreeWidget目录树组件

        QTreeWidget类是创建和管理目录树结构的类,实例使用了一个QTreeWidget组件管理照片目录,可以添加、删除节点,每个节点设置一个自定义类型,另外,还设置了一个自定义数据,图片节点储存完整文件名,以便单击节点时显示该图片

    • QDockWidget停靠区域组件

        QDockWidget是可以在QMainWidget窗口停靠,或在桌面最上层浮动的界面组件,实例将一个QTreeWidget组件放置在一个QDockWidget组件之上,设置其在主窗口的左右停靠或浮动

    • QLabel组件显示图片

        窗口右侧是一个QScrollArea组件,ScrollArea上面放置一个QLabel组件,通过QLabel设置一个QPixmap显示图片,通过QPixmap操作可进行缩放显示,包括放大、缩小、实际大小、适合宽度、适合高度等。

  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析: 根据问题描述,QTreeWidget的悬停节点和鼠标所在节点不一致。在设置QDockWidget浮动属性之后,这种现象消失了。这可能是由于QDockWidget的浮动属性引起的。

    解决方案: 在初始化QTreeWidget时,需要设置QTreeWidget的鼠标跟踪属性为true,以确保在鼠标悬停时能够正确地更新节点的状态。此外,还需要设置鼠标悬停事件的处理函数,以更新节点的状态。

    以下是可能的解决方案代码示例:

    // 初始化QTreeWidget
    QTreeWidget *treeWidget = new QTreeWidget(this);
    treeWidget->setMouseTracking(true); // 设置鼠标跟踪属性为true
    
    // 设置鼠标悬停事件的处理函数
    connect(treeWidget, &QTreeWidget::itemEntered, [=](QTreeWidgetItem *item, int column) {
        item->setSelected(true); // 更新节点的状态
    });
    
    // 设置QDockWidget的浮动属性
    QDockWidget *dockWidget = new QDockWidget(this);
    dockWidget->setFloating(false); // 设置为非浮动状态
    
    // 将QTreeWidget添加到QDockWidget
    dockWidget->setWidget(treeWidget);
    

    通过设置鼠标跟踪属性为true,当鼠标悬停在节点上时,会触发鼠标悬停事件,并通过处理函数更新节点的状态。这样可以确保节点的状态和鼠标位置一致。

    希望以上解决方案能够对您有所帮助。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^