• 12289阅读
  • 4回复

Qt做示波器,关于重绘问题 [复制链接]

上一主题 下一主题
离线reynoldxu
 

只看楼主 倒序阅读 楼主  发表于: 2011-02-05
— 本帖被 XChinux 执行加亮操作(2011-02-08) —
大家新年好,刚刚开始学qt,最近在做一个qt示波器(2440的板子)但碰到关于重绘的一个问题


【我原来的想法类只管把数据重绘出来,main函数负责把数据写入public:DrawBuffer数组中,现在时用AD来获取数据】


class Dialog【开始时选base class是Dialog】中增加了
//dialog.h
public:
    void paintEvent(QPaintEvent *);
    int DrawBuffer[320];//要重绘的数据
具体函数
//dialog.cpp
void Dialog::paintEvent(QPaintEvent *)
{
    int i;


    QPainter painter(this);


    QPixmap pixmap;
    pixmap = QPixmap(320,240);
    pixmap.fill(Qt::black);
    painter.drawPixmap(0, 0, pixmap);
    painter.initFrom(this);
    painter.setPen(Qt::green);
    painter.drawLine(  pixmap.width()/2,0,pixmap.width()/2,pixmap.height()  );//y
    painter.drawLine(0,pixmap.height()/2,pixmap.width(),pixmap.height()/2);//x


    painter.translate(0,120);
    painter.setPen(Qt::blue);
    i=0;
    for(i=0;i<320;i++){
        painter.drawPoint(i, -(DrawBuffer)  );
    }
}




主函数
//main.cpp
#include <QtGui/QApplication>
#include "dialog.h"


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>


int main(int argc, char *argv[])
{
    int fd,i;
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    
    fd = open("/dev/adc", 0);//打开ADC
        if (fd < 0){perror("open ADC device !");exit(1);}//是否打开错误
//!!   QMessageBox::information(NULL,"Info","start");//没这句话窗口无法绘制,只有一个鼠标箭头,背景全黑,但串口仍旧发送数据;;;;但时加了这句话后,可以重绘,但MessageDialog的部分无法重绘??


    while(1)//死循(读数据,写入DrawBuffer,重绘)
    {
        char buffer[5];
        int len ;
        for(i=0;i<320;i++)
        {
            len = read(fd, buffer, sizeof buffer);
            if (len > 0)
            {
                int value;
                sscanf(buffer, "%d", &value);
                w.DrawBuffer=value;      //写入Drawuffer
                printf("ADC Value: %d\n", value);//串口发出数据
            }
            else
            {
                perror("read ADC device !");
                exit(1);
            }
        }
        w.repaint();//重绘,原来是用update()的,但是无法重绘
    }
    a.exec();
}
于是,没有QMessageBox::information弹出窗口,就无法显示窗口,有一个鼠标箭头,背景全黑,但串口仍然发送数据(w.show();没用的??)-_-有了QMessageBox::information,QMessageBox::information那块地方始终无法重绘??


请教各位高手指点,谢谢!!
所有文件 Adc-show.tar.gz (3 K) 下载次数:93

离线sbtree
只看该作者 1楼 发表于: 2011-02-07
在a.exec被调用之前运行一个无事件处理的死循环是肯定不行的,因为操作系统没有机会处理事件,例如重绘事件。之所以在MessageBox出现的时候,你的界面重绘了,是因为在这种情况下,系统得到了一次重绘界面的机会。一个比较简单的解决方法是在世循环中调用一下a.processEvents(),也许能解决你的问题,但这不是一个理想的解决办法。比较好的方法还是要利用消息机制或者信号与槽的机制,这样就需要对你的adc设备进行对象封装,并提供数据可读,可写等信号或消息,从而触发界面更新的槽或回调函数。
windows 7 + VC++2008 + Qt4.5.2
离线reynoldxu

只看该作者 2楼 发表于: 2011-02-08
回 1楼(sbtree) 的帖子
谢谢sbtree,的确解决了!!我对于事件处理的理解还不够,学习了 ^-^
离线_sunday
只看该作者 3楼 发表于: 2011-03-09
我现在就想做一个类似的东西 可是根本摸不到头脑啊 能不能加上你的qq向你学习一下?
离线zhanzhp
只看该作者 4楼 发表于: 2012-03-17
可否指教一下,叫我的QQ314153916
快速回复
限100 字节
 
上一个 下一个