Qt 在Qlabel中使用setPixmap显示图像序列时出现问题

Qt 在Qlabel中使用setPixmap显示图像序列时出现问题,qt,qpixmap,qlabel,Qt,Qpixmap,Qlabel,我正在尝试使用setPixmap通过Qlabel显示一系列图像。我有一个包含图像文件名的QStringList和一个for循环,该循环在每个图像之后以5秒的等待时间遍历图像。但是,仅显示最后一个图像文件。当前,在等待第一次迭代期间,屏幕保持空白,直到最后一个图像最终显示。我已经读到使用for循环不起作用,我应该使用信号和插槽。不过,我对这个概念还不熟悉,如果能举个例子为我指明正确的方向,我将不胜感激 这是我目前的代码: MainWindow::MainWindow(QWidget *parent

我正在尝试使用setPixmap通过Qlabel显示一系列图像。我有一个包含图像文件名的QStringList和一个for循环,该循环在每个图像之后以5秒的等待时间遍历图像。但是,仅显示最后一个图像文件。当前,在等待第一次迭代期间,屏幕保持空白,直到最后一个图像最终显示。我已经读到使用for循环不起作用,我应该使用信号和插槽。不过,我对这个概念还不熟悉,如果能举个例子为我指明正确的方向,我将不胜感激

这是我目前的代码:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow){
   ui->setupUi(this);
   QStringList images;
   QString imageName;
   images << "redScreen.png" << "blueScreen.png" << "greenScreen.png";

   for(int x=0; x < images.size(); x++){
      imageName = images.at(x);
      this->displayScreen(imageName, 5);
   } 
}

void MainWindow::displayScreen(QString imageName, int wait){
   QTimer t;
   QEventLoop loop;
   QPixmap myImage;

   myImage.load(":/images/" + imageName);
   ui->imageLabel->setPixmap(myImage);
   ui->imageLabel->repaint();

   // 5 second wait between next iteration
   t.start(wait*1000);
   connect(&t, SIGNAL(timeout()), &loop, SLOT(quit()));
   loop.exec();
}
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent)、ui(新ui::MainWindow){
用户界面->设置用户界面(此);
QStringList图像;
QString图像名称;
图像集pixmap(myImage);
ui->imageLabel->repaint();
//在下一次迭代之间等待5秒
t、 启动(等待*1000);
连接(&t),信号(超时()),&loop,插槽(退出());
loop.exec();
}

对于您提到的任务,必须使用类似于以下代码的代码。(但需要清洁/班级组织)

QTimer定时器;
int x=0;
QStringList图像;
QString图像名称;
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(新ui::MainWindow){
用户界面->设置用户界面(此);

images最好的解决方案是带几个QTimer的DeepBlack,但如果你想冒险,你可以尝试在display image的for循环中插入一个函数。

通过eventloop hack的可重入等待是一个很难诊断错误的来源。不要使用它。你需要实例化自己的事件循环的情况非常少。甚至更确切地说是c复杂的项目可以完全避免它

您只需运行计时器并对计时器的滴答声做出反应。以下是一个示例:

#include <QApplication>
#include <QImage>
#include <QGridLayout>
#include <QLabel>
#include <QBasicTimer>

class Widget : public QWidget {
    QGridLayout m_layout;
    QLabel m_name, m_image;
    QStringList m_images;
    QStringList::const_iterator m_imageIt;
    QBasicTimer m_timer;
    void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() == m_timer.timerId()) tick();
    }
    void tick() {
        display(*m_imageIt);
        m_imageIt ++;
        const bool loop = false;
        if (m_imageIt == m_images.end()) {
            if (loop)
                m_imageIt = m_images.begin();
            else
                m_timer.stop();
        }
    }
    void display(const QString & imageName) {
        QImage img(":/images/" + imageName);
        m_name.setText(imageName);
        m_image.setPixmap(QPixmap::fromImage(img));
    }
public:
    Widget(QWidget * parent = 0) : QWidget(parent), m_layout(this) {
        m_images << "redScreen.png" << "blueScreen.png" << "greenScreen.png";
        m_imageIt = m_images.begin();
        m_layout.addWidget(&m_name, 0, 0);
        m_layout.addWidget(&m_image, 1, 0);
        tick();
        m_timer.start(5000, Qt::CoarseTimer, this);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
类Widget:publicqwidget{
QGridLayout Mu布局;
QLabel m_name,m_image;
QStringList m_图像;
常量迭代器m_imageIt;
基本定时器;
无效时间预览(QTimerEvent*ev){
如果(ev->timerId()==m_timer.timerId())勾选();
}
空勾(){
显示(*m_imageIt);
m_imageIt++;
const bool loop=false;
如果(m_imageIt==m_images.end()){
如果(循环)
m_imageIt=m_images.begin();
其他的
m_timer.stop();
}
}
无效显示(常量QString和imageName){
QImage img(:/images/“+imageName);
m_name.setText(图像名称);
m_image.setPixmap(QPixmap::frommage(img));
}
公众:
小部件(QWidget*parent=0):QWidget(parent),m_布局(this){

MY图像为什么在这种情况下使用QEntReCo?我用它作为延迟,不需要重新启动一个正在运行的计时器。事实上,这个代码是错误的:您必须停止在图像列表末尾的运行定时器,或者循环列表索引为零,以循环图像。C++中使用整数索引也有点可疑。他们的存在是有原因的。
#include <QApplication>
#include <QImage>
#include <QGridLayout>
#include <QLabel>
#include <QBasicTimer>

class Widget : public QWidget {
    QGridLayout m_layout;
    QLabel m_name, m_image;
    QStringList m_images;
    QStringList::const_iterator m_imageIt;
    QBasicTimer m_timer;
    void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() == m_timer.timerId()) tick();
    }
    void tick() {
        display(*m_imageIt);
        m_imageIt ++;
        const bool loop = false;
        if (m_imageIt == m_images.end()) {
            if (loop)
                m_imageIt = m_images.begin();
            else
                m_timer.stop();
        }
    }
    void display(const QString & imageName) {
        QImage img(":/images/" + imageName);
        m_name.setText(imageName);
        m_image.setPixmap(QPixmap::fromImage(img));
    }
public:
    Widget(QWidget * parent = 0) : QWidget(parent), m_layout(this) {
        m_images << "redScreen.png" << "blueScreen.png" << "greenScreen.png";
        m_imageIt = m_images.begin();
        m_layout.addWidget(&m_name, 0, 0);
        m_layout.addWidget(&m_image, 1, 0);
        tick();
        m_timer.start(5000, Qt::CoarseTimer, this);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}