gpt4 book ai didi

c++ - QT painter 仅在关闭窗口时更新计时器更新

转载 作者:行者123 更新时间:2023-11-28 07:29:55 26 4
gpt4 key购买 nike

我有一些数据会不断变化。我通过 QPainter 将这些数据绘制成一行,并想通过 QTimer 进行动态更新(每秒更新一次),但数据只会在我关闭绘画窗口时更新,它不会在窗口中实时更新。我哪里错了??这是代码:

#include <QtGui/QApplication>
#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QPainter>
#include <QTimer>

#define WINDOW_H 512
#define WINDOW_W 512

unsigned char *pMergedData;

class DrawDemo : public QWidget {
Q_OBJECT
public:
DrawDemo( QWidget *parent=0);
public slots:
void MyUpdate();
protected:
void paintEvent(QPaintEvent*);
private:
QTimer *timer;
};

void DrawDemo::MyUpdate(){
test_plot();
update();
}

DrawDemo::DrawDemo( QWidget *parent) :QWidget(parent){
pMergedData = (unsigned char *)malloc(200*sizeof(short));
QTimer *timer = new QTimer(this);
connect( timer, SIGNAL( timeout() ), this, SLOT( MyUpdate() ) );
timer->start( 1000 ); //ms
}

void DrawDemo::paintEvent( QPaintEvent * ) {
short *buf16 = (short *)pMergedData;

QPainter painter( this );
QPoint beginPoint;
QPoint endPoint;

painter.setPen(QPen(Qt::red, 1));
for( int i=0; i<199; i++ ) {
beginPoint.setX( 2*i );
beginPoint.setY( WINDOW_H - buf16[i] );
endPoint.setX( 2*i+1 );
endPoint.setY( WINDOW_H - buf16[i+1]);
painter.drawLine( beginPoint, endPoint );
}
}

int test_plot(){

counter_globol ++;
if(counter_globol%2==0){
for(int i=0; i<200; i++ ) {
pMergedData[i] = 100;
}
}else{
for(int i=0; i<200; i++ ) {
pMergedData[i] = i;
}
}

return 0;

}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);

DrawDemo *drawdemo = new DrawDemo( 0 );
drawdemo->setWindowTitle("QPainter");
drawdemo->resize(WINDOW_W, WINDOW_H);
drawdemo->show();

a.exec();
free(pMergedData);
return 0;
}

最佳答案

更新仅在您关闭窗口时发生,因为您的代码结构有误。

a.exec() 函数启动程序的主事件循环,它处理所有正在发生的事件,例如鼠标移动、按钮按下和计时器。在窗口关闭之前,它不会退出该功能。此时,a.exec() 期望程序结束。

在您发布的代码中,它为行设置数据,创建小部件,然后使用 a.exec() 启动消息处理程序。现在,这些行永远不会改变,因为 pMergedData 中的数据永远不会再次调用,直到窗口关闭,但 a.exec() 不应以这种方式处理。

当您关闭窗口并重新打开它时,a.exec() 函数返回并且由于您的 while 循环,pMergedData 中的数据被重新初始化并创建一个新窗口。

因此,要解决此问题,您需要这样的东西:-

int main(int argc, char *argv[])
{
QApplication a;

DrawDemo *drawdemo = new DrawDemo( 0 );
drawdemo->setWindowTitle("QPainter");
drawdemo->resize(WINDOW_W, WINDOW_H);
drawdemo->show();

a.exec();
return 0;
}

如您所见,我已将 QApplication 和 DrawDemo 对象的创建移出 test_plot 函数。由于您希望数据每秒更改一次,因此您还应该每秒调用 test_plot,因此不要让计时器每秒调用小部件函数更新,而是创建您自己的函数 MyUpdate 并连接到该函数:-

void DrawDemo::MyUpdate()
{
test_plot();
update();
}

关于c++ - QT painter 仅在关闭窗口时更新计时器更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17940588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com