- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要 Qt 中的快速绘图小部件,但我不想使用任何准备好的东西。我有一些 float 数据,例如 QVector< float >
数据,我需要在小部件上绘制它。但我不想使用 paintEvent
和 QPainter
直接在上面。是否有机会将此数据转换为位图(像素图?)并直接加载它以显示在小部件上?如何从 float 创建位图?
最佳答案
如果绘画是开销大的,你可以把它移到另一个线程,这样它就不会锁定你的应用程序的事件循环,并且在完成时更新结果。
既然你想要任意绘图,那么“将数据转换为位图”确实没有神奇的方法,你必须使用 QPainter
来绘制你的东西。
这是一个如何使用异步绘图仪对象的简单示例:
class Plotter : public QObject {
Q_OBJECT
public:
Plotter(QSize size, QRectF range, QVector<double> data)
: _size(size), _range(range), _data(data) { }
signals:
void done(QImage);
void cleanup();
public slots:
void plot() {
QElapsedTimer t;
t.start();
QImage img(_size, QImage::Format_ARGB32_Premultiplied);
img.fill(Qt::white);
QPainter p(&img);
QPen pen(Qt::darkBlue);
pen.setWidth(1);
p.setPen(pen);
for (int i = 0; i < _data.size(); i += 2) {
p.drawPoint(map(_data[i], _data[i + 1]));
}
qDebug() << "plotted in" << t.elapsed() << "msec";
emit done(img);
emit cleanup();
}
private:
inline QPointF map(double x, double y) {
return QPointF(_size.width() * (x / (_range.width() - _range.x())),
_size.height() * (y / (_range.height() - _range.y())));
}
QSize _size;
QRectF _range;
QVector<double> _data;
};
绘图仪是用它的大小、范围和数据参数创建的,我使用 QRectF
作为范围,基本上使用 x/width 和 y/height 作为水平和垂直范围。绘图仪是一个非常简单的实现,为了示例,它使用 map()
方法将数据点“规范化”到以线性方式绘制到的图像区域。我还添加了一个计时器来查看绘制所有点需要多长时间。
这是用于创建绘图、填充数据并显示结果的示例小部件:
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget * parent = 0) : QWidget(parent) {
// prepping data
QVector<double> data;
data.reserve(200000);
for (int i = 0; i < 200000; ++i) data.append((double)qrand() / RAND_MAX);
// create plotter and thread
Plotter * p = new Plotter(size(), QRectF(0, 0, 1, 1), data);
QThread * thread = new QThread;
p->moveToThread(thread);
// do connections
connect(thread, SIGNAL(started()), p, SLOT(plot()));
connect(p, SIGNAL(done(QImage)), this, SLOT(updatePlot(QImage)));
connect(p, SIGNAL(cleanup()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), p, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
protected:
void paintEvent(QPaintEvent *) {
QPainter p(this);
p.drawImage(QPoint(0, 0), plot);
}
public slots:
void updatePlot(QImage p) {
plot = p;
repaint();
}
private:
QImage plot;
};
在我的示例中,我使用 0-1 范围内的 200 000 个值填充数据。然后使用小部件的大小创建绘图仪,X 和 Y 的范围为 0-1,创建线程并将绘图仪移动到它,进行必要的连接并启动线程。启动后,线程将调用 plot()
插槽,它将绘图结果发送到小部件的 updatePlot()
插槽。当发送结果时,绘图仪将退出线程事件循环,这将删除绘图仪对象和线程,这样它们就不会泄漏。
至于这有多快,我的 i7 桌面在 8 毫秒内绘制了 200,000 个点,所以它无论如何都不慢。
关于qt - 在 Qt 中使用像素图或位图快速绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190411/
我想填充 3D 等高线图 (contour3(X,Y,Z)),就像 2D 等高线填充图 (contourf(X,Y,Z))。但我无法弄清楚如何实现这一目标。 contour3 和 surf 的组合不是
我有一个 c3.js 折线图,表示 2 个值的演变。我需要折线图的工具提示是饼图(工具提示 = 另一个 c3.js 图形)。 这是我成功的: http://jsfiddle.net/owhxgaqm/
我有具有结构的 Pandas 数据框: A B 0 1 1 1 2 1 2 3 4 3 3 7 4 6 8 如何生成 Seaborn Violin 图,每列作为其自己的单独
我正在使用 D3DXSPRITE 方法将我的 map 图 block 绘制到屏幕上,我刚刚添加了一个缩放功能,当您按住向上箭头时会放大,但注意到您现在可以看到图 block 之间的间隙,这是一些屏幕截
今天我们开始学习目前学习到的最难最复杂的数据结构图。 简单回顾一下之前学习的数据结构,数组、单链表、队列等线性表中数据元素是一对一关系,而树结构中数据元素是一对多关系,而图结构中数据元素则是多对
1、系统环境如下图: 2、为该系统添加一块新的虚拟硬盘,添加后需重启虚拟机,否则系统不识别;如下图,/dev/sdc 是新添加的硬盘; 3、fdisk /dev/sdc为新硬盘创建分区:
1、nagios简介 nagios是一款开源的电脑系统和网络监视工具,能有效监控windows、linux和unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发
越来越多人开始习惯用手机上网,浏览网页、查看邮件···移动化已经成为互联网发展必然趋势,包括facebook在内的很多互联网公司都将移动广告作为下一个淘金地
1.图片处理 1.圆角图片 复制代码 代码如下: /** * 转换成圆角 * &n
Microsoft SQL Server Management Studio是SQL SERVER的客户端工具,相信大家都知道。我不知道大伙使用导入数据的情况怎么样,反正我最近是遇到过。主要是因为没
debian6系统: 首先先安装mysql吧: 打开终端(root)用户登入 apt-get purge mysql-server-5.5 安装完成后: 默认情况下Mysql只允许本地登录
fedora16英文环境下支持中文输入法的方法 fedora16英文环境下支持FCITX的中文输入法: $ im-chooser 就会出现选择界面,选择第二个就行了。
Net预编译命令 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -? 显示说明 我们需要选择的命令为&n
有的时候电脑出现一些故障有的时候通过将其修改bios设置的方法来解决故障,那么在bios上设置能不能将电脑恢复出厂设置呢?其实也是可以的。方法也很简单的,只要会进入电脑的bios懂的上面英文的意思就
笔者曾介绍过Deepin 将对龙芯进行全面支持,打造最优美龙芯电脑桌面。现在Deepin团队移植工作取得了突破性的成果,Deepin桌面已经在龙芯3A和龙芯3B电脑上成功运行起来了。 以下为龙芯3
在安装一些软件之后,我们的电脑总是会发生一点小变化,不是桌面上多了几个网址图标,就是IE浏览器的默认主页被篡改成乱七八糟的网址。最可气的是,在IE设置中将默认主页改回来后,下次启动Win7后又变了回
“注册表编辑器怎么打开”虽说不是很难的问题,但是对于对电脑常识不是很擅长的网民来说,当电脑出现问题或需要更改设置时,着实还是件头疼的问题。因为需要打开注册表进行操作解决。那么如何打开注册表编辑器呢?
这篇文章重点介绍10个重要的WordPress安全插件和技巧,用来保护WordPress网站或者博客。 1. WP Security 人工帮助你修复被黑客入侵的网站,只要按照他们网站上的联系电话
其实运用object和javascript调用外部文件,也能实现不同栏目调用不同友情链接,即相当于调用不同栏目友情链接文件, {dede:field.typeid/}来获取当前栏目的ID。
我有一个复值矩阵。 如果我发出命令: plot(myMatrix) 然后它在图形设备上显示一种散点图,X 轴标记为 Re(myMatrix),Y 轴标记为 Im(myMatrix)。这显示了我正在寻找
我是一名优秀的程序员,十分优秀!