我是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);
};
答案 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();
// ...
}