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();
}
}
程序运行效果图片
请各位不吝赐教
在setFloating后,将QDOckWidget重新添加到原有的布局中,该现象消息,具体原因不知道,使用该方法本人的问题解决
不知道你这个问题是否已经解决, 如果还没有解决的话:此实例主要介绍QTreeWidget、QDockWidget的使用,以及用QLabel显示图片的方法,实例主要使用QTreeWidget,创建一个照片管理器,实例运行界面效果如下:
此实例的主窗口是从QMainWindow继承而来,主要演示了下面几个组件的使用:
QTreeWidget类是创建和管理目录树结构的类,实例使用了一个QTreeWidget组件管理照片目录,可以添加、删除节点,每个节点设置一个自定义类型,另外,还设置了一个自定义数据,图片节点储存完整文件名,以便单击节点时显示该图片
QDockWidget是可以在QMainWidget窗口停靠,或在桌面最上层浮动的界面组件,实例将一个QTreeWidget组件放置在一个QDockWidget组件之上,设置其在主窗口的左右停靠或浮动
窗口右侧是一个QScrollArea组件,ScrollArea上面放置一个QLabel组件,通过QLabel设置一个QPixmap显示图片,通过QPixmap操作可进行缩放显示,包括放大、缩小、实际大小、适合宽度、适合高度等。
问题分析: 根据问题描述,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,当鼠标悬停在节点上时,会触发鼠标悬停事件,并通过处理函数更新节点的状态。这样可以确保节点的状态和鼠标位置一致。
希望以上解决方案能够对您有所帮助。如果还有其他问题,请随时提问。