如何将Qline坐标发送到QPainter Widget
|
我创建了一个Qwidget Form_temp,它根据父窗口小部件MainWindow中创建的数据数组绘制线。我面临的问题是,我通过插槽send_data从MainWindow发送到Form_temp的数据没有被Form_temp中的其他函数看到。 (paintEvent)。
我无法找出漏洞。我添加了一些调试点来验证数据是否以Form_temp到达。
这是带有一些解释的代码。我使用QTCreator做到了这一点。请帮忙,我花了几天时间,无法继续前进。
另一个问题:每当用户移动鼠标或另一个小部件更新其视图时,paintEven都会发生(例如,我有一个显示时间的标签)。我想过滤QPaintevens,我只想在数据更改时进行更新。是否有比我编写的代码更好的方法?
Qwidget:标头
#ifndef FORM_TEMP_H
#define FORM_TEMP_H
#include <QWidget>
#include <QDebug>
namespace Ui { class Form_temp; }
class Form_temp : public QWidget {
Q_OBJECT
public:
QPainter *p;
void paintEvent(QPaintEvent*);
explicit Form_temp(QWidget *parent = 0);
~Form_temp();
void send_data (int *parray, int asize);
int array[48];
int size;
bool myupdate;
private:
Ui::Form_temp *ui;
};
#endif // FORM_TEMP_H
Qwidget:核心
#include \"form_temp.h\"
#include \"ui_form_temp.h\"
#include <cstdlib>
#include <QPainter>
#include <QDebug>
Form_temp::Form_temp(QWidget *parent) : QWidget(parent), ui(new Ui::Form_temp) {
myupdate = false;
ui->setupUi(this);
}
Form_temp::~Form_temp() { delete ui; }
void Form_temp::paintEvent(QPaintEvent*) {
qDebug(\"Paintevent occurs\");
if (myupdate) { // Event happen whenever I move the mouse,
// I only want an update when data changes.
p = new QPainter(this);
QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
p->setPen(pen);
p->setRenderHint(QPainter::Antialiasing,true);
qDebug()<< \"this size\" <<size;
for (int i= 0; i< size; ++i) {
qDebug()<< \"array[i\" <<i <<\"]=\"<< array[i];
}
[...]
p->drawLine(x1,y1,x2,y2);
[...]
}
myupdate = false;
}
void Form_temp::send_data (int *parray, int asize){
size = asize;
for (int i= 0; i< asize; ++i) {array[i] = parray[i];}
myupdate = true; // make sure the event will update the drawing
this->update(); // create a Qpaint Event
qDebug()<< size; // print the data so we know we are passing data correctly
for (int i= 0; i< asize; ++i) {
qDebug()<< \"array[i\" <<i <<\"]=\"<< array[i];
}
}
MainWindow:标头
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include \"gpio.h\"
#include \"form_temp.h\"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//QPropertyAnimation *m_ani ;
//QPropertyAnimation *m_ani2 ;
Form_temp *temp_graph;
[...]
#endif // MAINWINDOW_H
MainWindow:核心
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
// Start UI
ui->setupUi(this);
temp_graph = new Form_temp;
startTimer(1000); // get timer event every sec.
}
void MainWindow::timerEvent(QTimerEvent *event) {
int data[]= {1,2,3};
temp_graph->send_data(data, 3);
}
[...]
谢谢阅读。塞巴斯蒂安。
没有找到相关结果
已邀请:
1 个回复
搜洼挂时
子类
的,这意味着它有一些不必要的设计时负担。 当您创建
实例时,并未在构造函数中将
设置为父级,因此我不确定您的自定义小部件将如何绘制自身,因为它从未收到对
本身的调用。它也从未被摧毁。 也不存在使用插槽和实现所需的布线,因此无法确定在这种情况下这是否是问题区域。 但是,应该有可能实现您的目标:)我强烈建议您查看Qt Analog Clock Example,因为这很好地演示了如何实现自己的小部件。 您提到您只希望您的小部件在更改数据时进行更新,但是您误解了Qt框架的运行方式。您希望您的小部件在更改数据时自行绘制,但这不是小部件唯一需要自行绘制的时间,因此您不应尝试以此方式限制绘制操作。 将代码放在ѭ9中,它将根据当前数据绘制想要显示的整个小部件。当窗口小部件首次出现时,在先前被另一个窗口遮挡后以及其他无法控制的情况下显示时,框架将执行ѭ9。 添加普通方法(不需要插槽),使您可以从类外部更改基础数据,并确保这些方法在它们的末尾都包含对ѭ11的调用,以便它们向框架发出信号,表明应重新粉刷小部件。 如果您的窗口小部件复杂且绘制缓慢,您可以查看传递给
的事件中指定的区域,以将绘制代码限制为仅需要更新的区域。 更新: 您的代码已关闭。我已将其精简为基本知识,以演示基本知识。您应该能够根据需要对其进行详细说明。 main.cpp
MainWindow.h
main.cpp
Form_temp.h
Form_temp.cpp