Qt:选择的项目出现在 QGraphicsScene 的顶部

     2023-02-17     139

关键词:

【中文标题】Qt:选择的项目出现在 QGraphicsScene 的顶部【英文标题】:Qt: having selected items appear on top in QGraphicsScene 【发布时间】:2014-06-15 15:38:48 【问题描述】:

所以我有一个QGraphicsScene,里面有各种物品。其中一些可以在场景中采用相同的坐标。当我显示场景时,顶部显示的是最后添加的场景。有没有办法让某个项目始终出现在顶部,甚至更好地让它在程序期间重新出现在顶部(而不是删除它并再次添加它)?我一直在考虑先把所有的东西都画出来,然后用setVisible()来只显示我想要的项目,但是由于我想在网上添加新的东西,这似乎有点问题。

【问题讨论】:

【参考方案1】:

您可以使用QGraphicsItem::setZValue ( qreal z ) 设置项目的Z 值。 Z 值决定同级项的堆叠顺序。具有较高 Z 值的项目将始终绘制在具有较低 Z 值的另一个项目之上。默认 Z 值为零。因此,您可以将其设置为更高的值以将其置于首位:

item->setZValue(1);

或将其放在其他项目的底部:

item->setZValue(-1);

【讨论】:

1 是可能的最高 Z 值吗?因为如果不是 @Leslie 的答案将是正确的(尽管性能不佳)。 @rbaleksandar Z 值可能大于 1。管理 z 订单的逻辑取决于应用程序,可以通过多种方式完成。【参考方案2】:

在做了一些研究之后,我认为@Leslie 的答案比@Nejat 的答案更正确。但是,如果您有很多项目并且您必须经常进行检查,则效率非常低。

在我的情况下,我有一个 QGraphicsTextItem,它显示了我场景中光标的坐标。

void QCVN_SceneView::mouseMoveEvent(QMouseEvent *event)

  QPointF cursorPoint = mapToScene(event->pos());
//  cout << "Event pos: x=" << event->pos().x() << ", y=" << event->pos().y() << endl;
//  cout << "Event pos (in scene): x=" << cursorPoint.x() << ", y=" << cursorPoint.y() << endl;

  QString coords = QString("%1, %2")
                          .arg(cursorPoint.x())
                          .arg(cursorPoint.y());

  cursorSceneCoords->setPlainText(coords);
  cursorSceneCoords->setPos(cursorPoint);

  QGraphicsView::mouseMoveEvent(event);

显然,如果我在场景中有 10000000 个项目,使用 setZValue(1) 将无法解决问题,除非所有项目的 z-value 都低于 1。遍历整个项目列表也是一种不好的做法。

我稍微考虑了一下,当我想起setZValue() 使用qreal 参数时,我就震惊了。根据系统,它可以是doublefloat,但这并不重要。我们可以简单地使用std::numeric_limits 来获得非常非常高的价值。当然,我们必须限制场景中的所有项目(除了我们想要在顶部的所需的一次)以具有最大可能值 minus 1(或 0.1 或其他)的最大值 z-value。所以如果你这样做了

YOUR_GRAPHICS_ITEM.setZValue(std::numeric_limits<qreal>::max());

该项目将始终位于其余项目之上。

【讨论】:

【参考方案3】:

这个问题有点令人困惑。主题提到选择时想要的项目在顶部,而描述则谈论更永久的排序问题(创建等)。我添加这个答案是为了澄清由于主题而来到这里的人的可能解决方案:

对于永久订单深度管理setZValue 是要走的路。例如,具有组背景的节点视图应始终位于所有其他项目的后面,zValue 可以设置为 -100。 对于临时排序,例如选择,您不想弄乱永久排序(应为用户设置或应用程序特定的排序状态需要保留),您可以使用stackBefore。这将改变项目的顺序 在同一个 zDepth。 因此,选择项目时,您可以通过所有项目运行并调整顺序,并且您不必担心尝试重置zDepth后面完成的内容(我想你仍然想要恢复,但是至少这样,关注点与zDepth 是分开的。请注意,FWIW,我发现siblingstackBefore 排序感觉倒退了。

【讨论】:

【参考方案4】:

检查一下

http://www.qtcentre.org/threads/5428-help-with-ZValue!!

// Find largest Z
qreal maxZ = 0;
foreach (QGraphicsItem *item, 
        clickedItem>collidingItems(Qt::IntersectsItemBoundingRect))
    maxZ = qMax(maxZ, item->zValue());

// Assign new Z
clickedItem->setZValue(maxZ + some);

【讨论】:

【参考方案5】:

https://github.com/sonichy/HTYPaint2/blob/master/mainwindow.cpp#L775

void MainWindow::on_action_layerTop_triggered()

    if(scene->selectedItems().size() > 0)
        QList<QGraphicsItem*> collidingItems = scene->collidingItems(scene->selectedItems().first());
        for(int i=0; i<collidingItems.size(); i++)
            collidingItems.at(i)->stackBefore(scene->selectedItems().first());
        
        scene->update();
    

【讨论】:

qt添加工具栏

...程文件中,找到进入UI界面,左击UI界面,出现如下图,选择AddtoolBartootherArea,选择你想放置的位置,如果默认在顶部,直接选择添加工具栏。如图我添加到了左侧2.点击ActionEditor,然后点击新建,出现下图对话框填写文本,设置... 查看详情

如何在Qt中强制设置项目选择

】如何在Qt中强制设置项目选择【英文标题】:howtosettheitemselectionforcefullyinQt【发布时间】:2010-03-1906:33:04【问题描述】:谁能告诉我如何设置要强制选择的项目..我在将项目添加到列表行后尝试了这个..QModelIndexindex=mylistview->cu... 查看详情

Qt - 在选择抽象项目委托更改时触发事件

】Qt-在选择抽象项目委托更改时触发事件【英文标题】:Qt-Triggeringaneventwhenselectionofabstractitemdelegatechanges【发布时间】:2014-07-0407:58:22【问题描述】:我正在尝试制作一个表格视图,其中的每一列都有一个单独的下拉列表。用户... 查看详情

求助,在vs2013环境里搭载qt老是出现模块计算机类型“x86”与目标计算机类型“x64”冲突

...4位的QT,网上交的修改平台X64的办法已试过,可是我每次选择完X64平台后再打开还是变成WIN32的控制台,创建的路径没有中文名参考技术AThefollowingerroroccured:There'snoQtversionassignedtothisprojectforplatformWin32.Pleaseusethe'changeQtversion... 查看详情

Qt等待用户在QGraphicsScene中选择项目

】Qt等待用户在QGraphicsScene中选择项目【英文标题】:QtwaitforusertoselectitemsinQGraphicsScene【发布时间】:2013-06-1015:17:27【问题描述】:所以我的ui中有2个QGraphicsScenes和QGraphicsViews。在那些QGraphicScenes和QGraphicsItems中,现在我想让我的... 查看详情

如何使用qt插件在qt中进行ros开发

...个package1、新建项目“文件”——“新建文件或项目”,选择”ImportROSWorkspace”——“choose”如上图然后填写catkin工作空间的名字和位置,如下图我这里的Name和catkin工作空间文件夹名字相同(也可以不同)名为catkin_new,然后选... 查看详情

如何使用 pytest-qt 鼠标单击在 QTableWidget 中选择一个项目?

】如何使用pytest-qt鼠标单击在QTableWidget中选择一个项目?【英文标题】:HowtoselectaniteminaQTableWidgetusingpytest-qtmouseclick?【发布时间】:2021-08-2002:50:37【问题描述】:我的主GUI中有一个表格。我想测试我使用右键单击项目时出现的菜... 查看详情

解决qt编程出现c2001错误

...了QT的一个隐藏BUG,最终通过以下步骤解决了这个错误:选择QT界面菜单栏----编辑----SlectEncoding.. 查看详情

qt打开现有qt项目(打开已存在的项目|运行打开的项目)

...行项目)博客;一、打开已存在的项目进入QtCreator开发环境;选择"菜单栏/文件/打开文件或项目",选择打开.pro后缀的文件;然后选择配置工程,一般默认配置即可,点击右下角的"ConfigureProject"按钮;项目打开完成;二、运行打开... 查看详情

驾校科目一考试系统——新建项目(代码片段)

...pp.ui运行程序运行结果下一篇预告创建QT双击打开QT编译器选择新建文件或项目选择Application后再选择QT的桌面应用程序后点击Choose注意:项目名称不能出现中文汉字或者是空格,然后下一步选择MinGW编译组件&# 查看详情

02——驾校科目一考试系统——新建项目(代码片段)

...pp.ui运行程序运行结果下一篇预告创建QT双击打开QT编译器选择新建文件或项目选择Application后再选择QT的桌面应用程序后点击Choose注意:项目名称不能出现中文汉字或者是空格,然后下一步选择MinGW编译组件,下一步。... 查看详情

qt学习:vs中使用qt出现的常见问题:qdebug和qprintdialog的使用.

...它,感到很奇怪,其实很简单.首先鼠标右键点击项目,选择属性. 650)this.width=650;"sr 查看详情

Qt - QGraphics (Shaped) 项目的选择

】Qt-QGraphics(Shaped)项目的选择【英文标题】:Qt-SelectionofQGraphics(Shaped)Item【发布时间】:2017-02-1323:56:39【问题描述】:[1/2]上下文你好!Qt为我们提供了创建高度定制的图形项目的方法。我们需要做的就是从QGraphicsItem继承并覆盖纯... 查看详情

Qt Creator 在创建新项目时没有“Qt Gui Application”可供选择

】QtCreator在创建新项目时没有“QtGuiApplication”可供选择【英文标题】:QtCreatordon\'thave"QtGuiApplication"tochoosewhencreatingnewproject【发布时间】:2012-11-0515:59:25【问题描述】:安装QtCreator后,从http://qt-project.org/downloads-“QtCreator2... 查看详情

qt学习-----helloword

...Ctrl+N快捷键,或者单击欢迎模式中的NewProject按钮),在选择模板页面选择Application中的QtWidgetsApplication一项,然后单击Choose按钮。   2.在“项目介绍和位置”页面输入项目的名称为helloworld,然后单击创建路径右边的“... 查看详情

qt中如何改变label大小

一、在qt“文件”菜单下,选择“新建项目”或“文件”,在弹出菜单窗口中选择“文件和类”,然后单击右侧的“qt设计器接口类”。二、之后弹出窗口模板选择界面。在这里,我们选择qfram模板。读者可以自己选择其他模板,... 查看详情

qt如何导出成网页

...导出时,先将左下角的Debug改成Release点击左侧菜单栏项目,选择Builddirectory即构建产生的文件夹,其他的默认即可点击左侧运行按钮即可完成导出,导出的软件文件夹会自动出现在你指定的位置下,此时打开该文件夹,选择release文件夹打... 查看详情

如何使 Qt Quick (QML) ListView 项目无法选择?

】如何使QtQuick(QML)ListView项目无法选择?【英文标题】:HowcanimakeaQtQuick(QML)ListViewItemunselectable?【发布时间】:2011-10-0612:41:43【问题描述】:我可以使包含在ListView对象中的QML项不可选择吗?像这样的for(vari=0;i<ListView.model.count;i++... 查看详情