0

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

但是在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);
        }
   }

油漆.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);

};
4

1 回答 1

0

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

第一期

下面的代码告诉我你有一个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();
    // ...
}
于 2013-09-10T23:44:31.760 回答