QT根据串行接口上​​的输入显示不同的图像

时间:2019-04-26 08:45:14

标签: c++ qt embedded

我是QT的新手,我正在尝试创建一个程序,该程序根据来自串行接口的输入显示不同的图像。

我意识到有很多方法可以实现这一目标,我正在寻找具有QT经验的人作为输入。

我的想法是将新数据发送到比较函数,该函数将一个整数返回给主函数,该整数将确定要显示的图片。但是,使用while循环会导致图片被重新绘制并且不是静态的。

我的问题是,我应该为图像查看器启动另一个线程,还是为其使用其他类?

还是这种方法很丑陋,我应该重新开始吗?

感谢任何输入!


if(!serial.open(QIODevice::ReadOnly))
         qDebug() << serial.errorString();
     QObject::connect(&serial, &QSerialPort::readyRead, [&]
     {
          int comp=0;
          int landscape =1;
         int total_data = serial.bytesAvailable();
         qDebug() << "New data Available: " << serial.bytesAvailable();
         QByteArray datas = serial.readAll();
         comp= compare(total_data,datas);
         while(comp == landscape){
             qDebug() << "I Picture";
             QLabel label("<img src='landscape.jpg' /> ");
             label.show();
         }
         qDebug() << datas;
     });

这是从串行接口读取数据的比较功能


int compare(int x, QByteArray y)
{
int r=0;

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

        if (strncmp (y, "\x00",1) ==0)
        {
            //picture();
            r=1;
            return r;
        }
    }
    return r;
}

2 个答案:

答案 0 :(得分:1)

这样做:

while(comp == landscape){
    qDebug() << "I Picture";
    QLabel label("<img src='landscape.jpg' /> ");
    label.show();
}

您正在堆栈上创建本地QLabel。它将在每次迭代中销毁。

Qt使用其自身的机制来更新其对象(事件循环),而您只需要在需要时更改QLabel中的图片即可。

因此,您可以做的是,在小部件中创建QLabel并更改广告位中的图片:

class Window: public QWidget
{
Q_OBJECT
public:
   enum ImageType {
       landscape = 1,
   };
   Window(QObject* parent=nullptr): QWidget(parent),
   myLabel(new QLabel(this))
   {
      if(!serial.open(QIODevice::ReadOnly))
         qDebug() << serial.errorString();
     connect(&serial, &QSerialPort::readyRead, this, &Window::updateImage);
   }
public slots:
   void updateImage()
   {
       int total_data = serial.bytesAvailable();
       qDebug() << "New data Available: " << serial.bytesAvailable();
       QByteArray datas = serial.readAll();
       int const comp = compare(total_data,datas);
       if (comp == Window::landscape)
           myLabel->setPixmap("landscape.png");
       else
           myLabel->setPixmap("anotherImg.png");
       qDebug() << datas;
   }
private:
   QLabel* myLabel;
   QSerialPort serial;
};

答案 1 :(得分:0)

您可以使用信号/插槽和线程(仅当您想要在程序执行期间执行更多操作时)。使用串行线时,这是非常典型的,因为它是一个异步协议,必须拉出该协议才能知道是否存在新数据。

为此,每次您从串行线接收数据时都要发出一个信号,并创建一个处理它的插槽。这样,您将使用与事件驱动系统相似的系统。