Qt GraphicsView图形视图框架(Graphics View Framework)

2023-10-27

Graphics View提供了一个surface,用于管理大量定制的2D图形项并与之交互,还提供了一个View小部件,用于可视化项目,并支持缩放和旋转.

该框架包含一个事件传播框架,该架构允许对场景中的项目提供精确的双精度交互功能.项目可以处理按键事件,鼠标按下,移动,释放和双击事件,还可以跟踪鼠标移动。

Graphics View使用BSP(二进制空间划分)树来提供非常快速的项目发现,因此,它可以实时地可视化大型场景,甚至是数百万个项目.

注意: 该图形视图在Qt4.2引入,取代了它的前身QCanvas

图形视图架构(The Graphics View Architecture)

Graphics View为模型视图编程提供了一种基于项目的方法,很像InterView的便利类QTableView,QTreeView和QListView. 多个视图可以观察一个场景,该场景包含各种几何形状的项目.

场景(The Scene)

QGraphicsScene 提供图形视图场景.现场职责如下:

  • 为管理大量项目提供快速接口

  • 将事件传播到每个项目

  • 管理项目状态,例如选择和焦点处理

  • 提供未转换的渲染功能,主要用于印刷

场景作为一个容器 QGraphicsItem 对象. 项通过调用添加到场景 QGraphicsScene::addItem(), 然后通过调用多个项目发现函数中的一个来检索. QGraphicsScene::items() 它的重载返回包含在一个点,一个矩形,一个多边形或一个一般向量路径上或与之相交的所有项. QGraphicsScene::itemAt() 返回特定点上的最上面的项.所有项目发现函数都以降序堆叠的顺序返回项目.第一个返回的项是最上面的,最后一个返回项是最下面的.

  QGraphicsScene scene;
  QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));

  QGraphicsItem *item = scene.itemAt(50, 50);
  // item == rect

QGraphicsScene’s 事件传播体系结构为交付到项目安排场景事件,并管理项目之间的传播.如果场景在某个位置接收到鼠标按下事件,则场景将该事件传递到该位置的任何项.

QGraphicsScene还管理某些项目状态,比如项目选择和焦点.通过调用 QGraphicsScene::setSelectionArea(),传递任意形状,可以在场景中选择项目.这个功能也被用作QGraphicsView中橡皮筋选择的基础.调用QGraphicsScene::selectedItems()来获取当前选中的所有项目的列表. QGraphicsScene处理的另外一种状态是一个项是否具有键盘输入焦点.你可以通过调用QGraphicsScene::setFocusItem() 或者QGraphicsItem::setFocus()来设置一个焦点,或者通过调用QGraphicsScene::focusItem()来获取当前的焦点项目.

最后, QGraphicsScene允许您通过QGraphicsScene::render() 函数将场景的一部分渲染到绘图设备中.您可以在文本后面的打印部分了解更多信息.

视图(view)

QGraphicsView 提供view小部件,用于可视化场景的内容.您可以将多个视图附加到同一个场景,从而在同一个数据集中提供多个视图.view小部件是一个滚动区域,提供滚动条用于大场景中导航.要启用OpenGL支持,可以通过调用QGraphicsView::setViewport()将QGLWidget设置为viewport.

QGraphicsScene scene;
myPopulateScene(&scene);

QGraphicsView view(&scene);
view.show();

视图接收来自键盘和鼠标的输入事件,并在将事件发送到可视化场景之前将这些事件转换为场景事件(在适当的地方将使用的坐标转换为场景坐标).

使用它的变换矩阵QGraphicsView::transform(),视图可以变换场景的坐标系统。这允许高级导航功能,如缩放和旋转。为了方便,QGraphicsView还提供了视图和场景坐标转换的函数:

  • QGraphicsView::mapToScene()

  • QGraphicsView::mapFromScene()

项目(Item)

QGraphicsItem是场景中图形项目的基类. 图形视图为典型的形状提供了几个标准项,例如矩形(QGraphicsRectItem), ellipses(QGraphicsEllipseItem), 和文本项(QGraphicsTextItem),但是在编写自定义项时可以使用最强大的QGraphicsItem特性.此外,QGraphicsItem支持以下功能:

  • 鼠标按下,移动,释放和双击事件,以及鼠标悬停事件,滚轮事件和上下文菜单事件.

  • 键盘输入焦点和按钮事件

  • 拖放功能

  • 通过父子关系和使用QGraphicsItemGroup进行分组

  • 碰撞检测

项目位于本地坐标系统中,与QGraphicsview一样,它还提供了许多函数,用于在项目和场景之间以及项目与项目之间映射坐标.同样,像QGraphicsView一样,它可以使用一个矩阵来转换它的坐标系统:QGraphicsItem::transform().这对于旋转和缩放单个项目非常有用.

项目可以包含其他项目(子项目). 父项的转换由它的所有子项继承.然而,不管一个项目的累积转换是什么,它的所有函数(QGraphicsItem::contains(),QGraphicsItem::boundingRect(),QGraphicsItem::collidesWith())仍然在本地坐标中运行.

QGraphicsItem通过QGraphicsItem::shape()函数和QGraphicsItem::collidesWith()支持碰撞检测这两个函数都是虚函数.通过从QGraphicsItem::shape()返回你的物品的形状作为一个本地坐标QPainterPath, QGraphicsItem将为你处理所有的碰撞检测.但是,如果您希望提供自己的碰撞检测,则可以重新实现QGraphicsItem::collidesWith()

在这里插入图片描述

图形视图框架中的类(Classes in the Graphics View Framework)

这些类为创建交互式应用程序提供了一个框架.

类名 功能
QGraphicsEffect 用于所有图形效果的基类
QGraphicsAnchor 表示QGraphicsAnchorLayout中两个项之间的锚
QGraphicsAnchorLayout 可以在图形视图中锚定小部件的布局
QGraphicsGridLayout 在图形视图中管理小部件的网络布局
QAbstractGraphicsShapeItem 所有路径项的公共基础
QGraphicsEllipseItem 可以添加到QGraphicsScene中的椭圆项中
QGraphicsItem QGraphicsScene中所有图形项的基类
QGraphicsItemGroup 将一组项视为单个项的容器
QGraphicsLineItem 可以添加到QGraphicsScene中的行项目
QGraphicsObject 需要信号,槽和属性的所有图形项的基类
QGraphicsPathItem 路劲项,您可以添加到QGraphicsScene
QGraphicsPixmapItem 你可以添加到QGraphicsScene的Pixmap项目
QGraphicsPolygonItem 多边形项目,你可以添加到QGraphicsScene
QGraphicsRectItem 添加矩形项目到QGraphicsScene
QGraphicsSimpleTextItem 简单的文本路径项,您可以添加到QGraphicsScene
QGraphicsTextItem 显示格式化文本的文本项,添加到QGraphicsScene
QGraphicsLayout 图形视图中所有布局的基类
QGraphicsLayoutItem 是否可以继承,以允许您的自定义项被布局管理
QGraphicsLinearLayout 在图形视图中管理小部件的水平或垂直布局
QGraphicsProxyWidget 代理层,用于在QGraphicsScene中嵌入QWidget
QGraphicsScene 用于管理大量2D图形项目的Surface
QGraphicsSceneContextMenuEvent 图形视图框架中的上下文菜单事件
QGraphicsSceneDragDropEvent 在图形视图框架中用于拖放的事件
QGraphicsSceneEvent 所有图形视图相关事件的基类
QGraphicsSceneHelpEvent 请求工具提示时的事件
QGraphicsSceneHoverEvent 在图形视图框架中悬浮事件
QGraphicsSceneMouseEvent 图形视图框架中的鼠标事件
QGraphicsSceneMoveEvent 图形视图框架中的鼠标移动事件
QGraphicsSceneResizeEvent 事件,用于在图形视图框架中调整小部件大小
QGraphicsSceneWheelEvent 图形视图框架中的滚动事件
QGraphicsSimpleTextItem 简单的文本路径项,您可以添加到QGraphicsScene
QGraphicsSvgItem 可用于呈现SVG文件内容的QGraphicsItem
QGraphicsTextItem 可以添加到QGraphicsScene以显示格式化文本的文本项
QGraphicsTransform 用于在QGraphicsItems上构建高级转换的抽象基类
QGraphicsView 小部件,用于显示QGraphicsScene的内容
QGraphicsWidget QGraphicsScene中所有部件项的基类
QStyleOptionGraphicsItem 用于描述绘制QGraphicsItem所需的参数
图形视图坐标系统(The Graphics View Coordinate System)

图形视图基于笛卡尔坐标系;项目在场景中的位置和几何图形由两组数字表示: x坐标和y坐标. 当使用未转换视图观察一个场景时,场景上的一个单元用屏幕上的像素表示.

注意:不支持倒y轴坐标系统(y向上增长),因为图形视图使用Qt的坐标系统。

在图形视图中有三种有效的坐标系统:项目坐标、场景坐标和视图坐标。为了简化实现,Graphics View提供了方便的函数,允许您在三个坐标系统之间进行映射。

在渲染时,图形视图的场景坐标对应于QPainter的逻辑坐标,视图坐标与设备坐标相同。在坐标系统文档中,您可以了解逻辑坐标和设备坐标之间的关系。

在这里插入图片描述

项目坐标(Item Coordinates)

项目存在于它们自己的局部坐标系中。它们的坐标通常以其中心点(0,0)为中心,这也是所有变换的中心。项目坐标系统中的几何原语通常被称为Item点、Item行或Item矩形。

在创建自定义项目时,项目坐标是您所需要担心的全部;QGraphicsScene和QGraphicsView将为您执行所有转换。这使得实现定制项非常容易。例如,如果接收到鼠标按下或拖动输入事件,则事件位置以项目坐标表示。contains()虚函数接受项坐标中的point参数,如果某个点在项中,则返回true,否则返回false。类似地,项目的边框矩形和形状在项目坐标中。

在项目的位置是项目在其父坐标系中的中心点的坐标;有时也称为父坐标。这个场景在这个意义上被看作是所有无父母项目的“父母”。顶级项目的位置在场景坐标中。

子坐标是相对于父坐标的。如果子坐标未进行转换,则子坐标与父坐标之间的差异与父坐标中的项之间的距离相同。例如:如果一个未转换的子项目被精确地定位在它的父项目的中心点上,那么这两个项目的坐标系统将是相同的。但是,如果子节点的位置是(10,0),则子节点的(0,10)点将对应于其父节点的(10,10)点。

因为项的位置和转换是相对于父元素的,所以子元素的坐标不受父元素转换的影响,尽管父元素的转换会隐式地转换子元素。在上面的例子中,即使父节点被旋转和缩放,子节点的(0,10)点仍然会与父节点的(10,10)点相对应。然而,相对于场景,孩子会跟随父母的转变和位置。如果父节点被缩放(2x, 2x),子节点的位置将是场景坐标(20,0),其(10,0)点将对应于场景上的点(40,0)。

对于QGraphicsItem::pos()是少数例外之一,QGraphicsItem的函数在项坐标中操作,而与项或其父项的转换无关。例如,一个项目的边界rect(即QGraphicsItem::boundingRect())总是在项目坐标中给出。

场景坐标(Scene Coordinates)

场景代表了它所有项目的基础坐标系统。场景坐标系统描述了每个顶级项的位置,也构成了从视图交付到场景的所有场景事件的基础。场景中的每一项都有一个场景位置和边框(QGraphicsItem::scenePos(), QGraphicsItem::sceneBoundingRect()),以及它本地的项pos和边框。场景位置描述了物品在场景坐标中的位置,它的场景边界矩形是QGraphicsScene决定场景中哪些区域发生了变化的基础。场景中的更改通过QGraphicsScene::changed()信号进行通信,参数是一个场景矩形列表。

视图坐标(View Coordinates)

视图坐标是小部件的坐标。视图坐标中的每个单元对应一个像素。这个坐标系统的特殊之处在于它相对于小部件或视口,不受所观察场景的影响。QGraphicsView的左上角总是(0,0),右下角总是(视口宽度,视口高度)。所有鼠标事件和拖放事件最初都作为视图坐标接收,您需要将这些坐标映射到场景,以便与项目交互。

坐标映射(Coordinate Mapping)

通常在处理场景中的项目时,将坐标和任意形状从场景映射到项目,从项目映射到项目,或者从视图映射到场景是很有用的。例如,当您在QGraphicsView的viewport中单击鼠标时,您可以通过调用QGraphicsView::mapToScene(),然后是QGraphicsScene::itemAt()来询问场景光标下是什么项目。如果你想知道一个项目在视图中的位置,你可以在项目上调用QGraphicsItem::mapToScene(),然后在视图上调用QGraphicsView::mapFromScene()。最后,如果您使用want来查找视图椭圆内的项目,您可以将QPainterPath传递给mapToScene(),然后将映射的路径传递给QGraphicsScene::items()。

通过调用QGraphicsItem::mapToScene()和QGraphicsItem::mapFromScene(),您可以将坐标和形状映射到或映射到一个项目的场景。还可以通过调用QGraphicsItem::mapToParent()和QGraphicsItem::mapFromParent()映射到项的父项,或者通过调用QGraphicsItem::mapToItem()和QGraphicsItem::mapFromItem()在项之间映射。所有的映射函数都可以映射点、矩形、多边形和路径。

视图中也有相同的映射功能,用于从场景映射到场景。QGraphicsView: mapFromScene()和QGraphicsView: mapToScene()。要从视图映射到项,首先要映射到场景,然后从场景映射到项。

关键特性

缩放和旋转(Zooming and rotating)

QGraphicsView支持与QPainter通过QGraphicsView::setMatrix()实现的相同的仿射转换。通过对视图应用转换,您可以轻松添加对常见导航特性(如缩放和旋转)的支持。

下面是一个如何在QGraphicsView的子类中实现缩放和旋转槽的例子:

  class View : public QGraphicsView
  {
  Q_OBJECT
      ...
  public slots:
      void zoomIn() { scale(1.2, 1.2); }
      void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
      void rotateLeft() { rotate(-10); }
      void rotateRight() { rotate(10); }
      ...
  };

槽可以连接到启用了自动重复功能的qtoolbutton上。
QGraphicsView在转换视图时保持视图的中心对齐。
请参阅弹性节点示例,了解如何实现基本的缩放特性。

Printing

图形视图通过其渲染函数QGraphicsScene::render()和QGraphicsView::render()提供单行打印。这些函数提供了相同的API:你可以通过传递一个QPainter给任何一个渲染函数来让场景或视图渲染它们的全部或部分内容到任何渲染设备中。这个示例展示了如何使用QPrinter将整个场景打印到整个页面中。

QGraphicsScene scene;
  scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

  QPrinter printer;
  if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
      QPainter painter(&printer);
      painter.setRenderHint(QPainter::Antialiasing);
      scene.render(&painter);
  }

场景和视图渲染函数的区别是,一个在场景坐标中操作,另一个在视图坐标中操作。render()通常用于打印未转换的场景的整个片段,例如绘制几何数据,或打印文本文档。另一方面,QGraphicsView::render()适合截屏;它的默认行为是使用所提供的绘制器呈现视窗的确切内容。

  QGraphicsScene scene;
  scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

  QPixmap pixmap;
  QPainter painter(&pixmap);
  painter.setRenderHint(QPainter::Antialiasing);
  scene.render(&painter);
  painter.end();

  pixmap.save("scene.png");

当源区域和目标区域的大小不匹配时,源内容将被拉伸以适应目标区域。通过向正在使用的渲染函数传递Qt::AspectRatioMode,可以选择在内容被拉伸时保持或忽略场景的高宽比。

拖放功能(Drag and Drop)

因为QGraphicsView间接继承QWidget,所以它已经提供了QWidget提供的相同拖放功能。另外,为了方便起见,图形视图框架为场景和每个项目提供了拖放支持。当视图接收到拖放时,它将拖放事件转换为QGraphicsSceneDragDropEvent,然后将其转发到场景。场景接管该事件的调度,并将其发送到鼠标光标下接受drop的第一项。

要从一个项目开始拖放,创建一个QDrag对象,传递一个指针到开始拖放的小部件。项目可以被多个视图同时观察,但是只有一个视图可以开始拖放。在大多数情况下,拖动是由于按下或移动鼠标而开始的,因此在mousePressEvent()或mouseMoveEvent()中,您可以从事件中获得原始小部件指针。例如:

  void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
  {
      QMimeData *data = new QMimeData;
      data->setColor(Qt::green);

      QDrag *drag = new QDrag(event->widget());
      drag->setMimeData(data);
      drag->start();
  }

为了拦截场景的拖放事件,在QGraphicsItem子类中重新实现QGraphicsScene::dragEnterEvent()以及特定场景需要的任何事件处理程序。你可以在QGraphicsScene的每个事件处理程序的文档中了解更多关于图形视图中的拖放操作。

项目可以通过调用QGraphicsItem::setAcceptDrops()来启用拖放支持。要处理传入的拖放,重新实现QGraphicsItem::dragEnterEvent()、QGraphicsItem::dragMoveEvent()、QGraphicsItem::dragLeaveEvent()和QGraphicsItem::dropEvent()。

有关图形视图支持拖放操作的演示,请参阅拖放机器人示例。

游标和工具提示(Cursors and Tooltips)

与QWidget一样,QGraphicsItem也支持游标(QGraphicsItem::setCursor())和工具提示(QGraphicsItem::setToolTip())。游标和工具提示在鼠标进入项目区域时由QGraphicsView激活(通过调用QGraphicsItem::contains()检测)。

您还可以通过调用QGraphicsView::setCursor()在视图上直接设置默认游标。

有关实现工具提示和光标形状处理的代码,请参见拖放机器人示例。

动画(Animation)

图形视图支持动画在几个级别。您可以使用动画框架轻松地组装动画。为此,您需要您的项目从QGraphicsObject继承并将QPropertyAnimation与它们关联。QPropertyAnimation允许动画任何QObject属性。

另一个选项是创建一个从QObject和QGraphicsItem继承的自定义项。项目可以设置自己的计时器,并通过QObject::timerEvent()中的递增步骤控制动画。

第三个选项是通过调用QGraphicsScene::advance()来推进场景,而QGraphicsItem::advance()则是通过调用QGraphicsItem::advance()来推进场景。

OpenGL渲染

要启用OpenGL呈现,只需通过调用QGraphicsView::setViewport()将一个新的QGLWidget设置为QGraphicsView的viewport。如果你想要OpenGL抗锯齿,你需要OpenGL缓冲样本支持(参见QGLFormat::sampleBuffers())。

  QGraphicsView view(&scene);
  view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
项目组(Item Groups)

通过使一个项成为另一个项的子项,您可以实现项分组的最基本特性:项将一起移动,并且所有的转换将从父项传播到子项。

此外,QGraphicsItemGroup是一个特殊项,它将子事件处理与用于向组添加和从组中删除项的有用接口结合在一起。向QGraphicsItemGroup添加项将保持项的原始位置和转换,而重新生成项通常将导致子元素相对于其新父元素重新定位自身。为了方便起见,可以通过调用QGraphicsScene::createItemGroup()通过场景创建QGraphicsItemGroups。

小部件和布局(Widgets and Layouts)

Qt 4.4通过QGraphicsWidget引入了对几何和布图感知项的支持。这个特殊的基本项类似于QWidget,但与QWidget不同的是,它不继承QPaintDevice;而不是QGraphicsItem。这允许您编写带有事件、信号和插槽、大小提示和策略的完整小部件,您还可以通过QGraphicsLinearLayout和QGraphicsGridLayout来管理小部件的几何图形。

QGraphicsWidget

基于QGraphicsItem的功能和精简的内存占用,QGraphicsWidget提供了两方面的优点:QWidget提供的额外功能,例如样式、字体、调色板、布局方向及其几何形状,以及QGraphicsItem提供的分辨率独立性和转换支持。因为图形视图使用实坐标而不是整数,所以QGraphicsWidget的几何函数也对QRectF和QPointF进行操作。这也适用于框架矩形,页边距和间距。例如,在QGraphicsWidget中,将内容边距指定为(0.5,0.5,0.5,0.5)并不少见。你可以创建子窗口和“顶级”窗口;在某些情况下,您现在可以将图形视图用于高级MDI应用程序。

支持QWidget的一些属性,包括窗口标志和属性,但不是全部。您应该参考QGraphicsWidget的类文档,了解什么是受支持的,什么是不受支持的。例如,您可以通过将Qt::Window窗口标志传递给QGraphicsWidget的构造函数来创建装饰窗口,但是图形视图目前不支持macOS上常见的Qt::Sheet和Qt::Drawer标志。

QGraphicsLayout

QGraphicsLayout是专门为QGraphicsWidget设计的第二代布局框架的一部分。它的API与QLayout非常相似。您可以在QGraphicsLinearLayout和QGraphicsGridLayout中管理小部件和子输出。您也可以通过自己子类化QGraphicsLayout来轻松编写自己的布局,或者通过编写适配器QGraphicsLayoutItem的子类来将自己的QGraphicsItem项添加到布局中。

嵌入式小部件支持(Embedded Widget Support)

图形视图为在场景中嵌入任何小部件提供了无缝支持。您可以嵌入简单的小部件,如QLineEdit或QPushButton,复杂的小部件,如QTabWidget,甚至完整的主窗口。要将小部件嵌入到场景中,只需调用QGraphicsScene::addWidget(),或者创建一个QGraphicsProxyWidget实例来手动嵌入小部件。

通过QGraphicsProxyWidget, Graphics View能够深入集成客户端widget特性,包括游标、工具提示、鼠标、平板和键盘事件、子widget、动画、弹出窗口(例如QComboBox或QCompleter),以及widget的输入焦点和激活。QGraphicsProxyWidget甚至集成了嵌入部件的选项卡顺序,这样您就可以通过选项卡进出嵌入的部件。您甚至可以在场景中嵌入一个新的QGraphicsView来提供复杂的嵌套场景。

性能(Performance)

浮点比较指令(Floating Point Instructions)

为了准确、快速地将转换和效果应用到项目上,图形视图是在假设用户的硬件能够为浮点指令提供合理性能的情况下构建的。

许多工作站和台式计算机都配备了合适的硬件来加速这种计算,但一些嵌入式设备可能只提供库来处理数学操作或在软件中模拟浮点指令。

因此,某些类型的效果在某些设备上可能比预期的要慢。可以通过在其他领域进行优化来弥补这种性能损失;例如,使用OpenGL渲染一个场景。但是,如果这些优化也依赖于浮点硬件,那么它们本身可能会导致性能下降。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt GraphicsView图形视图框架(Graphics View Framework) 的相关文章

  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 如何向同一个 QMenu 添加多个 QAction?

    我正在尝试实现 Qt 菜单自定义 并且我提供了一个功能来添加相同的功能QAction在同一个人民币上下文菜单中多次 但是当我尝试这样做时 myMenu gt addAction myAction myMenu gt addAction my
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 将 QByteArray 从大端转换为小端

    我想我在这里有点不知所措 我尝试了这么简单的事情 我不敢相信没有任何内置的 Qt 使用 Qt 5 6 2 我尝试将 QByteArray 内的数据从大端转换为小端 总是从相同的测试 QByteArray 开始 就像这样 QByteArray

随机推荐

  • Mac基于Gin、Docker-Compose、Mysql的入门搭建

    Mac基于Gin Docker Compose Mysql的入门搭建 在Mac装golang 在Goland建项目 安装Gin 粘贴3个go文件 配置docker 安装mysql 用DataGrip建表录入简单数据 配置Docker Com
  • 字符串类算法题:反转字符串中的单词(js版本)

    题目如下 LeetCode原题链接请点击这里 lesson1 chars js代码如下 解法一 12ms export default str gt 字符串分割成数组 return str split map item gt return
  • 关闭JDWP端口,或者JDWP端口不对公网开放

    查询出的端口是8000 我只需要把8000端口关闭就可以了 ubuntu 查看端口使用情况 使用netstat命令 查看所有服务端口 netstat ap 查看指定端口 可以结合命令grep命令 netstat ap grep 8000 若
  • 深度学习实战之线性回归

    1 线性回归 连续值的预测 目的使模型的预测值逼近于真实值 在训练模型中 函数参数w b往往是不可知的 所以需要对其进行求解 构造一个loss函数 使得误差函数取得最小值 得到的w b 即为模型要求的参数 求loss函数的最小值 通过梯度下
  • 异常中禁用e.printStackTrace()

    相信大家在开发代码的过程中都用过try catch语句 不知道有没有人写过这种语句 try catch Exception e e printStackTrace log error error e 或者 try catch Excepti
  • js时间对比的问题

    开发中 对于时间对比 大家都比较喜欢从页面获取时间之后 直接使用大于小于做判断 比如这样 javascript view plain copy if bgTime edTime bgTime gt edTime alert 开始时间不能晚于
  • 超好用的webssh(支持秘钥登录)

    webssh 项目地址 https github com billchurch WebSSH2 安装 webssh cd usr local git clone https github com billchurch WebSSH2 git
  • 调用其他文件的define_DEFINE_PROFILE用法介绍(1)

    01 概述 可以使用DEFINE PROFILE定义一个自定义边界配置文件或单元格区域条件 该条件随空间坐标或时间而变化 可以自定义的变量如下 速度 压力 温度 湍流动能 湍流耗散率 质量流量 目标质量流量作为流动时间的函数 物种质量分数
  • 新春特辑

    志在哪里 哪里就有成功 心在哪里 哪里就有风景 爱在哪里 哪里就有感动 在新年来临之际 互联互通社区衷心祝愿您 春节快乐 身体健康 心想事成 1 中国非结构化数据中台实践白皮书 2 2020中国服装行业数据中台研究报告 3 2020中国数据
  • Java嵌套if选择结构

    嵌套if选择结构本期用两个例题来讲解 例题1 学校举行运动会 百米赛跑成绩在12s内有资格进入决赛 否则淘汰 进入决赛再根据性别来区别进入男子组决赛和女子组决赛 public static void main String args Sca
  • 区块链学习3:区块链的共识机制

    前往老猿Python博文目录 共识机制主要用于解决分布式计算的根本问题数据的一致性 所谓共识 简单理解就是指参与方都达成一致 在区块链系统中 如何让每个节点通过一个规则将各自的数据保持一致是一个很核心的问题 这个问题的解决方案就是制定一套共
  • Python 写函数,传入一个参数n,返回n的阶乘

    def factorial n param n 参数 return 返回结果 if n lt 0 exit sum 1 for i in range 1 n 1 sum i print sum return factorial 8
  • 分享8个超神的Pycharm插件们,可以说是无敌的存在!

    分享几个YYDS的Pycharm插件 1statics staitcs可以作为KPI摸鱼好助手 120w次下载的这个插件 可以直接统计代码的具体情况 对工程里的每个代码文件进行统计代码量 空行量 注释量 代码行占比等进行清晰统计 下次就算功
  • centos7 nodejs 启动vue项目

    1 准备项目文件及目录 2 检查nodejs 环境 3 安装vue cli脚手架构建工具 命令 npm install g vue cli 4 切换项目目录 运行初始化命令 切换命令 cd projects DDSWeb 初始化命令 vue
  • STM32F1端口复用与重映射(学习心得)

    端口的复用 以USART1为例 PA9管脚的复用功能为 USART1 TX 串口发送端 PA10管脚的复用功能为USART1 RX 串口接收端 对端口复用的配置 GPIO端口的时钟使能 RCC APB2PeriphClockCmd RCC
  • C语言编程必将成为通用技能

    正文 为什么我们要学习编程 编程是当今时代不可或缺的核心技能 它不仅仅是程序员的专属领域 而是逐渐成为一种通用技能 被越来越多的人所需 想象一下 不久的将来 编程将变成人人都会的事情 而职业编程人员会逐渐减少 就像识字一样 编程将成为人们必
  • 用Java实现分页

    查询完全表之后 接下来要做的是查询总条数 和当前是第几页 总共有几页 包括数据 通过Java思想将封装为类 然后调用 pageBean java类可以当做通用的分页的类 Service作用是封装一类服务 比如说注册或者说登录 它是一类服务
  • IMS中Binder案例

    IMS中Binder案例 1 FWK层中AIDL形式 1 1 服务端实现Stub 1 2 客户端获取proxy 2 Native层中AIDL形式 2 1 服务端对应Bn端 2 2 客户端对应Bp端 android12 release 1 F
  • C++指针的使用

    一 指针的定义和使用 可以通过指针来保存一个变量的地址 例如 int a 2 就相当于内存中分出了一个内存块给变量a 而这个内存块中储存的数值为2 假设这个内存块的地址为0x2e 则可以通过定义一个指针来储存这个地址0x2e 指针就是一个地
  • Qt GraphicsView图形视图框架(Graphics View Framework)

    Graphics View提供了一个surface 用于管理大量定制的2D图形项并与之交互 还提供了一个View小部件 用于可视化项目 并支持缩放和旋转 该框架包含一个事件传播框架 该架构允许对场景中的项目提供精确的双精度交互功能 项目可以