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