Qt调用更新时不会触发对paintEvent()的调用,同时将数据从串行端口绘制到scrollArea

时间:2013-09-10 13:21:33

标签: qt

我是Qt 5.1.0的新手。 Qt的问题直接表现如下。来自串口的数据由readdata()接收,然后调用mainwindow.cpp中的draw()将数据传递给paint.cpp中的newpaint()。在这个项目中创建了两个类:class mainwindow主要负责从串口接收数据,类paint用于在主窗口的滚动区域小部件上绘制数据(实际上数据是数学函数的坐标)。 / p>

但是在paint.cpp中,update()不调用paintevent.UpdateEnabled()返回true,表示在使用update()时不存在问题。

主要部分粘贴在下面。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QPainterPath linepath;
    linepath.moveTo(0,0);
    ui->setupUi(this);
    paintwiget=new paint(linepath,ui->scrollArea);
    ui->scrollArea->setWidget(paintwiget);
    paintwiget->show();
    ui->closeserial->setEnabled(false);
    ui->sendData->setEnabled(false);

    serial=new QSerialPort(this);


     connect(serial,SIGNAL(readyRead()),this,SLOT(readData()));


}


   void paint::newpaint(qreal *aa1, int len1)
   {
       if (!aa.isEmpty())
           aa.clear();
      int i;
      for (i=0;i<len1;i++)
          aa.append(aa1[i]);
     // qDebug()<<aa.size();
      //qDebug()<<"aa[0:3]"<<aa[0]<<" "<<aa[1]<<" "<<aa[2]<<" "<<aa[3];
          len=len1;
//          this->setVisible(true);
           qDebug()<<this->isVisible();//now returns true
          this->update();


          //qDebug()<<"okla";

   }
   void paint::paintEvent(QPaintEvent *)
   {
       qDebug()<<"ok~~";
       QPointF currentpoi;
       QPainter painter(this);
       int ii=0;
       qDebug()<<len;
       for (ii=0;ii<len/2;ii++)
       {
           currentpoi=path.currentPosition();
           qDebug()<<"currentpoi"<<currentpoi;
           path.moveTo(currentpoi);
           path.lineTo(aa[2*ii],aa[2*ii+1]);
      // painter.setRenderHint(QPainter::Antialiasing);
           painter.drawPath(path);
        }
   }

paint.h

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QTabWidget>
//#include <mainwindow.h>

class paint : public QWidget
{
public:
  explicit paint(QPainterPath &path,QWidget *parent=0);
void newpaint(qreal *,int);
QVector <qreal>aa;
int len;
QWidget *parent;

private:

  QPointF point;
 QPainterPath path;
protected:
 void paintEvent(QPaintEvent *event);

};

1 个答案:

答案 0 :(得分:0)

很难确定这是您面临的唯一问题,但至少有三个问题:

第1期

以下代码告诉我您的MainWindow成员名为paint * paintwiget

void MainWindow::draw(qreal *aa,int len)
{
    // ...
    paintwiget->newpaint(dist,len);
}

然后,此代码告诉我您创建一个同名的新临时变量:

MainWindow::MainWindow(QWidget *parent)
{
    // ...
    paint *paintwiget=new paint(linepath,ui->scrollArea->viewport());
}

编译器应该给你一个警告。将此行替换为:

paintwiget = new paint(linepath,ui->scrollArea->viewport());

(注意缺少paint *),并告诉我这是否解决了这个问题。

第2期

你必须改变这个:

void paint::newpaint(qreal *aa, int len)
{
    // ...
    aa[i]=aa[i];
    len=len;
}

由此:

void paint::newpaint(qreal *aa_new, int len_new)
{
    // ...
    aa[i]=aa_new[i];
    len=len_new;
}

否则,您的aa[i]=aa[i]无效:它会自动替换方法的参数,而不是通过方法的参数替换您的成员。使用与成员名称相同的参数“隐藏”成员:您无法​​再访问它,无论是在作业的左侧还是右侧。

第3期

我不太确定你在scrollArea->viewport()的构造函数中使用paint做了什么,但是有些东西告诉我你做错了。 paint的构造函数不应该使用它,而是应该执行:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{    
    ui->setupUi(this);
    QPainterPath linepath;
    paintwiget = new paint(linepath); // Do NOT pass viewport in parameter
    ui->scrollArea->setWidget(paintwiget);
    paintwiget->show();
    // ...
}