QT показывает разные изображения в зависимости от ввода на последовательном интерфейсе - PullRequest
0 голосов
/ 26 апреля 2019

Я новичок в 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 ]

1 голос
/ 26 апреля 2019

Делая это:

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;
};
0 голосов
/ 26 апреля 2019

Вы можете использовать сигналы / слоты и поток (только если вы хотите выполнять больше действий во время выполнения программы). Это очень типично при использовании последовательной линии, так как это асинхронный протокол, который необходимо использовать, чтобы узнать, существуют ли новые данные.

Для этого подайте сигнал каждый раз, когда вы получаете данные из последовательной линии, и создайте слот для их обработки. Таким образом, вы будете использовать систему, аналогичную управляемой событиями.

...