问题标签 [qpainter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1864 浏览

c++ - 在 Qt 中围绕 QWidget 拖动对象

我正在尝试在 Qt Creator 中制作一个支持拖动对象的自定义小部件。在最简单的形式中,小部件有一个 QRect(或任何其他形状),我可以在其上单击然后将其拖动到小部件周围。一旦我释放鼠标按钮, QRect 应该停止被拖动。

在我的 QWidget 类中,我有这个方法

当指针在屏幕上移动时,它可以获得鼠标的坐标。我尝试更新 x 和 y 的成员变量,然后通过 paintEvent 方法绘制 QRect,但这不起作用。

有没有人有什么建议?

0 投票
1 回答
1259 浏览

qt - 共享 OpenGL VAO/VBO/等。通过 QGLWidget

我正在使用 QGLWidgets 的 3 层层次结构在我的 CAD 类应用程序中的 5 个 OpenGL 视口之间共享着色器和顶点数据。根上下文用于编译应用程序范围的着色器,每个文档上下文用于共享模型顶点数据,视口上下文是实际执行渲染的上下文(还包含网格顶点数据和其他每个视口的内容)。

着色器共享似乎工作正常,网格绘图也是如此,但是在共享顶点数据时它失败了,老实说 - 我看不出它应该如何工作......

我在模型上下文处于当前状态时为项目构建了一个 3D 图标,因为它是第一个 VAO,它的“名称”为 1。当我开始绘制对象时,视口上下文(与模型上下文共享,请记住) 是当前的,因此调用了 VAO 1,但绘制的是视口的VAO 1 - 我漂亮的红色网格中心线。可以共享 OpenGL 上下文,但是如何指定每个项目所属的“命名空间”,因为名称不是唯一的?

我尝试在模型 VAO 调用之前使模型上下文处于当前状态,但是绘制了正确的 VAO 和视口,我认为在 QPainter::beginNativePainting() 块期间切换上下文不会让 OpenGL 高兴。

这对我来说似乎是一件非常基本的事情,所以我必须做一些愚蠢的事情 - 有什么建议吗?

0 投票
2 回答
2390 浏览

c++ - 用于linux的c++ 2d绘图工具

我正在为 Linux 寻找一个简单的 c++ 2d 绘图工具(更诚实地说是“跨平台”)。

“koolplot”很好,但我认为它仅适用于 Windows,因为它的代码包括 graphics.h 和 windows.h。

有人建议使用 Qt 的 QPainter,但我什至不能用它来绘制单点。:'(

因此,如果对其他绘图工具有任何帮助或关于 Qt 的 QPainter 的体面教程,我将不胜感激。

谢谢。

0 投票
3 回答
2009 浏览

c++ - 使用 QtConcurrent 加载 Pixmap 并绘制它

我正在尝试创建一个 Tile 渲染程序。这是一些基本代码。

标题

共产党:

我正在尝试制作一个将大图像的图块粘贴到 QGraphicsScene 上的应用程序。但是一次加载所有图块非常耗时并且占用大量内存。所以我继承了 QGraphicsItem 并覆盖了paint。QGraphicsItem 类中的paint 方法仅在它进入QGraphicsView 内部时被调用。因此,通过在绘画中加载我的图块,我基本上可以创建一个仅在图块出现时才加载图块的应用程序。到目前为止,这很有效。

为了让用户体验更好,我使用 QtConcurrent 尝试在单独的线程中加载磁贴。所以这是我所做的更改。

CPP

LoadTilePixmap 函数:

这段代码应该可以工作,但是一旦调用paint,它就会在运行时崩溃。添加断点后,我将问题缩小到temp->tileItem->paint(painter,option,widget);导致崩溃的范围。

我得到的输出是

谁能帮助我,让我知道为什么 lastline/paint 方法会崩溃。我该如何解决?

编辑代码以更新更改

0 投票
1 回答
2413 浏览

c++ - 如何将 Qline 坐标发送到 QPainter Widget

我创建了一个 Qwidget Form_temp,它根据在父小部件 MainWindow 中创建的数据数组绘制线条。我面临的问题是我通过插槽 send_data 从 MainWindow 发送到 Form_temp 的数据在 Form_temp 中的其他函数看不到。(油漆事件)。

我无法弄清楚循环孔。我添加了几个调试点来验证数据是否到达 Form_temp。

这是带有一些解释的代码。我是用 QTCreator 做的,请帮忙,我花了几天时间,无法继续前进。

另一个问题:每次用户移动鼠标或另一个小部件更新其视图时都会发生paintEven(例如,我有一个显示时间的标签)。我想过滤 QPaintevens,我只想在数据更改时进行更新。有没有比我编码的更好的方法来做到这一点?

Qwidget:标题

Qwidget:核心

主窗口:标题

主窗口:核心

谢谢阅读。塞巴斯蒂安。

0 投票
0 回答
419 浏览

c++ - Qt:滚动复杂的内容。网络浏览器引擎。选择文本

只是对在 Web 浏览器中滚动复杂的内容(例如应用程序)感到好奇。假设我使用的是 Qt 和 C++。这不是“如何”的问题,而更像是“它是如何工作的”?完全源于我好奇的非理性问题。

我做了一个小实验。

  1. 创建了 800x60000 像素的大型 QWidget。
  2. 添加了 300 个 800x200 像素的 QWidget,它们正在使用 QPainter 进行绘画。当调用paintEvent() 时,每个小部件都会将其唯一名称打印到控制台。
  3. 添加 (1.) 到 QScrollArea 800x800。
  4. 滚动时,我注意到仅重绘未完全显示在屏幕上的小部件。一次只有 1 个小部件(场景:http ://savepic.ru/2670640.jpg )。所以 QScrollArea (或 QWidget?谁决定要重绘什么小部件?)是聪明的 - 我们没有加载 CPU 来一直重绘所有 300 个小部件或存储 800x60000 像素图的内存消耗(-;

假设我想使用鼠标在我的“网页”上选择文本和其他元素。所以我希望能够标记它们(通过改变背景)。我将如何实施?不同的网络浏览器如何做到这一点?选择图片、文本、表格...我应该考虑跟踪鼠标并在元素和我的自定义小部件后面绘制灰色/蓝色/粉红色背景框吗?

我有另一个实验 - 显示一堆消息。方案是相同的,除了这里没有使用 QPainter - 只有 QLabels、QTextExits、QPushButtons(场景:http ://savepic.ru/2632728.jpg )。我可以为 QLabel 设置一个标志 SelectableByMouse,但我如何选择多于 1 条消息?

您可以建议我使用一些 Qt HTML 渲染器,但这不是“它是如何工作的”的答案。

0 投票
2 回答
1408 浏览

c++ - Qt 在一个窗口中绘制图形

  1. 我创建了类 Widget,它创建了窗口,这个类在窗口上绘制了一些东西(即它按我的意愿工作)。
  2. 我创建了一个类,Circle,我想在类 Widget 的窗口上绘画。
  3. 我传递了 Widget 的地址并尝试使用 QPainter paint(Widget 的地址)在 Widget 上绘画;(以 Circle 为例)但我什么也没看到。

在程序执行期间,我尝试使代码尽可能短,我键入对象 Widget 的地址。它没有改变。这意味着Widget的地址是正确传递的。

在任何地方,当我输入 Widget 的地址时,我都会收到相同的地址。这是代码:

标题小部件

小部件.cpp

头文件 Circle.h

圈子.cpp

主要的

程序编译链接成功

0 投票
1 回答
2008 浏览

c++ - 如何从 Qt 中的另一个类访问变量?

我正在尝试在 Qt 中实现一个具有 2 个小部件的主窗口:一个区域用于绘制一些点,一个列表框用于将所有点与它们各自的坐标一起写入。我想在主窗口上实现一个按钮的“删除点”功能,即当我按下按钮时,从列表框中选择的点应该从我正在绘制的区域中消失。所以我想用信号/槽来做这件事,但是当我试图从我的绘图区域访问我的点列表时,它只是找不到任何包含数据。到目前为止,这是我的代码:

paintwidget.cpp(我的主窗口):

p>

renderarea.cpp(我的绘图区):

p>

列表框.cpp:

p>

来自渲染区域的列表是 QPoints 的 QList。问题是在 FOR 循环中列表的大小为 0,所以我看不到它应该包含的任何点。我认为我无法在某个地方初始化它,但我不确定在哪里。

这些点是用 QPainter 绘制的,所以当我从列表中删除点时,是否有可能从我的绘图区域中删除它们?

0 投票
2 回答
2619 浏览

qt - 单击表格单元格后,QtableView 中的某些单元格不会自动重绘

我在交互式棋盘游戏的实现中使用了 QTableView。图像将显示在表格的单元格中。我正在使用带有绘制函数的 QStyledItemDelegate 在表格单元格内绘制图像。

由于图像应仅在表格的某些单元格中显示并在用户单击表格单元格时更新,因此使用与表格具有相同尺寸的双整数数组。根据数组的值,画家应该在表格的特定单元格中绘制图像。最初,表格的 4 个单元格内只有 4 个图像,当用户单击表格中的一个单元格时,数组会更新,这意味着应该更改表格单元格内绘制和显示的内容。

通常,用户单击已成功更新的空(白色)单元格,并且特定图像会显示在单元格中。但是,如果存在其他包含图像且应更新的单元格,则不会显示更新,尽管更新了双整数数组。我还看到了一件奇怪的事情,那就是当我点击应该更新其显示的单元格时,就会发生更新。这当然会发生,无论当有人单击单元格时我如何更新。

我试图在重绘之前先擦除单元格内的内容,但它仍然无法正常工作。委托是否在线程中连续运行,并且使用表中每个单元格的索引调用画家函数?我不明白包含图像的单元格的更新如何不会自动更新,尽管画家应该重新绘制单元格的区域并且它仅在单击单元格后才会发生。还是每次都会调用一个新的painter到painter的函数?!

好吧,这是我对委托的画家功能的实现:

如果您需要解决我的问题,我可以为您提供更多信息。提前致谢。

0 投票
2 回答
1793 浏览

qt - 从“QEvent*”到“QPaintEvent*”的无效转换

试图找出是否发生触摸事件或者只是绘制它们。