我是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;
}
答案 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)
您可以使用信号/插槽和线程(仅当您想要在程序执行期间执行更多操作时)。使用串行线时,这是非常典型的,因为它是一个异步协议,必须拉出该协议才能知道是否存在新数据。
为此,每次您从串行线接收数据时都要发出一个信号,并创建一个处理它的插槽。这样,您将使用与事件驱动系统相似的系统。