Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数组的值传递到类Qt 5.0 C++; 我对QT编程和面向对象编程比较新颖,我有一些C++知识,主要使用微控制器来实现简单的控制电路和硬件接口,用于自动化系统。_C++_Arrays_Qt - Fatal编程技术网

如何将数组的值传递到类Qt 5.0 C++; 我对QT编程和面向对象编程比较新颖,我有一些C++知识,主要使用微控制器来实现简单的控制电路和硬件接口,用于自动化系统。

如何将数组的值传递到类Qt 5.0 C++; 我对QT编程和面向对象编程比较新颖,我有一些C++知识,主要使用微控制器来实现简单的控制电路和硬件接口,用于自动化系统。,c++,arrays,qt,C++,Arrays,Qt,我正在尝试使用Qt创建一个GUI来显示从存储在数组中的x-y点绘制的线,并能够使用单独的线程更新数组中的值 目前,我有一个非常简单的程序从数组中绘制线条,但我不知道如何从main.cpp或其他线程将更新的值传递到此数组 我已附上我的代码如下 // painterdialog.h #ifndef PAINTERDIALOG_H #define PAINTERDIALOG_H #include <QDialog> #include <QPainter> namespa

我正在尝试使用Qt创建一个GUI来显示从存储在数组中的x-y点绘制的线,并能够使用单独的线程更新数组中的值

目前,我有一个非常简单的程序从数组中绘制线条,但我不知道如何从main.cpp或其他线程将更新的值传递到此数组

我已附上我的代码如下

 // painterdialog.h

#ifndef PAINTERDIALOG_H
#define PAINTERDIALOG_H

#include <QDialog>
#include <QPainter>

namespace Ui {
class PainterDialog;
}

class PainterDialog : public QDialog
{
    Q_OBJECT

public:
    explicit PainterDialog(QWidget *parent = 0);
    ~PainterDialog();

private:
    Ui::PainterDialog *ui;

protected:
    void paintEvent(QPaintEvent *e);
};

#endif // PAINTERDIALOG_H
//painterdialog.h
#ifndef油漆工Dialog_H
#定义绘画对话
#包括
#包括
名称空间用户界面{
类绘画对话;
}
类绘画对话:公共QDialog
{
Q_对象
公众:
显式绘图对话框(QWidget*parent=0);
~PainterDialog();
私人:
Ui::PainterDialog*Ui;
受保护的:
无效油漆事件(QPaintEvent*e);
};
#endif//PAINTERDIALOG_H
main.cpp如下

#include "painterdialog.h"
#include <QApplication>


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

    w.show();

    return a.exec();
}
#include "painterdialog.h"
#include "ui_painterdialog.h"

PainterDialog::PainterDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::PainterDialog)
{
    ui->setupUi(this);
}

PainterDialog::~PainterDialog()
{
    delete ui;
}

void PainterDialog:: paintEvent(QPaintEvent *e)
{

    int xVal[12] = {0,1,2,4,0,5,8,0,9,10,30,9999};
    int yVal[12] = {0,1,2,5,0,7,7,0,8,20,10,9999};
    QPainter MyPainter(this);

    QPen PointPen(Qt::red);
    PointPen.setWidth(5);

    QPen LinePen(Qt::green);
    LinePen.setWidth(2);
    QPoint p1;
    QPoint p2;

    for(int x = 0; x<12 ; x++)
    {

        p1.setX(xVal[x]*10);
        p1.setY(yVal[x]*10);

        p2.setX(xVal[x+1]*10);
        p2.setY(yVal[x+1]*10);

        MyPainter.setPen(PointPen);
        MyPainter.drawPoint(p1);
        MyPainter.drawPoint(p2);

        MyPainter.setPen(LinePen);
        if(xVal[x]&&yVal[x] != 0 && xVal[x+1]&&yVal[x+1] !=0)//draw a connecting lines to points not going to the origin (infinity)
        {
            MyPainter.drawLine(p1, p2);
        }

        if(xVal[x+2]==9999)
        {
            break;
        }

    }


    QPen LinePen2(Qt::black);
    LinePen2.setStyle( Qt::DashDotLine );
    LinePen2.setWidth(3);

    MyPainter.setPen(LinePen2);
    MyPainter.drawLine(QPoint(300,100), QPoint(100,200));
}
#包括“painterdialog.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
画家对话w;
w、 show();
返回a.exec();
}
下面是painterdialog.cpp

#include "painterdialog.h"
#include <QApplication>


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

    w.show();

    return a.exec();
}
#include "painterdialog.h"
#include "ui_painterdialog.h"

PainterDialog::PainterDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::PainterDialog)
{
    ui->setupUi(this);
}

PainterDialog::~PainterDialog()
{
    delete ui;
}

void PainterDialog:: paintEvent(QPaintEvent *e)
{

    int xVal[12] = {0,1,2,4,0,5,8,0,9,10,30,9999};
    int yVal[12] = {0,1,2,5,0,7,7,0,8,20,10,9999};
    QPainter MyPainter(this);

    QPen PointPen(Qt::red);
    PointPen.setWidth(5);

    QPen LinePen(Qt::green);
    LinePen.setWidth(2);
    QPoint p1;
    QPoint p2;

    for(int x = 0; x<12 ; x++)
    {

        p1.setX(xVal[x]*10);
        p1.setY(yVal[x]*10);

        p2.setX(xVal[x+1]*10);
        p2.setY(yVal[x+1]*10);

        MyPainter.setPen(PointPen);
        MyPainter.drawPoint(p1);
        MyPainter.drawPoint(p2);

        MyPainter.setPen(LinePen);
        if(xVal[x]&&yVal[x] != 0 && xVal[x+1]&&yVal[x+1] !=0)//draw a connecting lines to points not going to the origin (infinity)
        {
            MyPainter.drawLine(p1, p2);
        }

        if(xVal[x+2]==9999)
        {
            break;
        }

    }


    QPen LinePen2(Qt::black);
    LinePen2.setStyle( Qt::DashDotLine );
    LinePen2.setWidth(3);

    MyPainter.setPen(LinePen2);
    MyPainter.drawLine(QPoint(300,100), QPoint(100,200));
}
#包括“painterdialog.h”
#包括“ui_painterdialog.h”
PainterDialog::PainterDialog(QWidget*父项):
QDialog(父级),
用户界面(新用户界面::画师对话)
{
用户界面->设置用户界面(此);
}
画师对话::~PainterDialog()
{
删除用户界面;
}
void PainterDialog::paintEvent(QPaintEvent*e)
{
int xVal[12]={0,1,2,4,0,5,8,0,9,10,309999};
int-yVal[12]={0,1,2,5,0,7,7,0,8,20,109999};
QPainter MyPainter(本);
QPen圆珠笔(Qt::红色);
点笔设置宽度(5);
QPen LinePen(Qt::绿色);
LinePen.setWidth(2);
点p1;
点p2;

对于(int x=0;x而言,您似乎在混合使用“进程”和“线程”这两个术语。如果您是指“线程”,那么我建议您编辑您的问题,因为线程之间的通信编程要比进程之间的通信容易得多

我认为在您的案例中,有两个主要概念是类和机制。QThread用于通过以太网读取x/y数据,signal/slot用于通知数据已更新并应重新绘制

#include <QThread>
#include <QList>
#include <QPoint>

class DataFetcher : public QObject
{
    Q_OBJECT

signals:
    void dataChanged(QList<QPoint> data);

public slots:
    void startFetching() {
        //here you fill your data batch and pass it to PrinterDialog in GUI thread

        /*cycle over data batches*/ {
            QList<QPoint> data;

            /*cycle over point in batch*/ {
                QPoint p = ...; // take next point from your laser

                data << p;
            }

            emit dataChanged(data);
        }
    }
};
#包括
#包括
#包括
类DataFetcher:公共QObject
{
Q_对象
信号:
无效数据更改(QList数据);
公众时段:
void startFetching(){
//在这里,您将填充数据批并在GUI线程中将其传递给PrinterDialog
/*循环数据批处理*/{
QList数据;
/*批次中的循环结束点*/{
QPoint p=…;//从激光器中获取下一个点

数据当UI线程绘制数组值时,您使用另一个进程而不是使用工作线程来更新数组值有什么原因吗?更新的x/y点来自哪里?没有理由使用另一个进程而不是工作线程。更新的x/y点来自使用Ethernet Communicate的另一个线程离子到一个2D激光扫描仪,该扫描仪正在将极坐标转换为X Y值,以放置到UI线程将绘制的数组中。如果需要IPC,可以使用QSharedMemory。但在通知数据更改方面存在问题。更重要的解决方案是使用QLocalSocket。但是,正如@Matthwe所说,将所有逻辑放在同一个进程中非常好ess.@CullodenSpectre是指从2D激光器输入的点数的速率,是一个已知的速率,还是会有很大的变化?@Matthew:从激光器输入的点数的速率会有很大的变化。