C++ qt显示1/4秒的图像

C++ qt显示1/4秒的图像,c++,qt,C++,Qt,嘿,我曾多次尝试在显示图像时使用usleep或qt sleep来完成此操作,但有时(几乎每次)它会显示为白色,而不是图像基本上我希望它接受任何输入,表示我准备好了,然后在1.5-3秒的随机时间范围内显示编号为1-28的随机图像,然后显示250毫秒,然后隐藏并等待2秒,然后显示图片3秒,然后重复。我在debian上,g++ 提前谢谢 int getRandInt(int x){ return rand() % x; } class I : public QThread { publi

嘿,我曾多次尝试在显示图像时使用usleep或qt sleep来完成此操作,但有时(几乎每次)它会显示为白色,而不是图像
基本上我希望它接受任何输入,表示我准备好了,然后在1.5-3秒的随机时间范围内显示编号为1-28的随机图像,然后显示250毫秒,然后隐藏并等待2秒,然后显示图片3秒,然后重复。我在debian上,g++
提前谢谢

int getRandInt(int x){
    return rand() % x;
}



class I : public QThread
{
public:
        static void sleep(unsigned long secs) {
                QThread::msleep(secs);
        }
};



QApplication app(argc, argv);

std::ostringstream oss;
oss << "images/" << getRandInt(28) << ".jpg";
std::cout << oss.str();

QString qstr = QString::fromStdString(oss.str());

QPixmap pixmap(qstr);
QPixmap pixmap2(qstr);

QSplashScreen splash(pixmap);
QSplashScreen splash2(pixmap2);

QMainWindow mainWin;

while(1==1){
    splash.show();
    splash.showMessage(QObject::tr("test"),
    Qt::AlignLeft | Qt::AlignTop, Qt::black);
    app.processEvents();
    I::sleep(250);
    splash.finish(0);
    splash.raise();   
    I::sleep(2*1000);
    splash2.show();
    splash2.showMessage(QObject::tr("test"),Qt::AlignLeft | Qt::AlignTop, Qt::black);
    app.processEvents(); I::sleep(5000);splash2.finish(&mainWin);splash2.raise(); 
}
intgetrandint(intx){
返回rand()%x;
}
类I:公共QThread
{
公众:
静态无效睡眠(无符号长秒){
QThread::msleep(secs);
}
};
QApplication应用程序(argc、argv);
std::ostringstream oss;

oss理解为“在1.5-3秒的随机时间范围内显示编号为1-28的随机图像,然后显示250毫秒”意味着“在1.75秒和3.25秒的随机时间内显示编号为1-28的随机图像”,如下所示

该代码需要Qt5.x和一个C++11编译器。我试图强调C++11的正确使用。我不知道你的代码的最终用途,但如果你用
std::mt19937\u 64
代替
random\u engine
,就随机性而言,这就足够进行心理学研究了

显示的图像是从一组28幅图像中随机抽取的。每个源图像也是随机生成的

请注意,明显没有任何形式的睡眠或繁忙的循环,并且热衷于使用lambdas。如果用Python编写,这段代码不会更短。这就是C++11带给您的:简洁性,以及其他东西:)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
typedef std::默认随机引擎随机引擎;
QImage随机图像(整数大小、随机引擎和rng){
QImage img(大小,大小,QImage::Format_ARGB32_预乘);
图像填充(Qt::白色);
QPainter p&img;
p、 SetRenderInt(QPaint::抗锯齿);
int N=std::均匀分布(25200)(rng);
标准:均匀实分布dP(0,大小);
标准:均匀分布dC(0,255);
QPointF pt1(dP(rng),dP(rng));
对于(int i=0;i对于(int n=0;n<28;++n)睡眠期间的图像不会调用processEvents。创建一个具有时钟比较的循环以循环所需时间,调用processEvents会有所帮助。睡眠会冻结整个应用程序,因此在睡眠期间不会执行任何操作。QSplashScreen用于启动屏幕。如果要显示图像,请使用
QLabel
#include <QApplication>
#include <QStateMachine>
#include <QTimer>
#include <QStackedWidget>
#include <QPainter>
#include <QLabel>
#include <QPushButton>
#include <random>

typedef std::default_random_engine random_engine;

QImage randomImage(int size, random_engine & rng) {
   QImage img(size, size, QImage::Format_ARGB32_Premultiplied);
   img.fill(Qt::white);
   QPainter p(&img);
   p.setRenderHint(QPainter::Antialiasing);
   int N = std::uniform_int_distribution<>(25, 200)(rng);
   std::uniform_real_distribution<> dP(0, size);
   std::uniform_int_distribution<> dC(0, 255);
   QPointF pt1(dP(rng), dP(rng));
   for (int i = 0; i < N; ++i) {
      QColor c(dC(rng), dC(rng), dC(rng));
      p.setPen(QPen(c, 3));
      QPointF pt2(dP(rng), dP(rng));
      p.drawLine(pt1, pt2);
      pt1 = pt2;
   }
   return img;
}

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   std::random_device rd;
   random_engine gen(rd());

   int imageSize = 300;
   QList<QImage> images;
   for (int n = 0; n < 28; ++n) images << randomImage(imageSize, gen);
   std::uniform_int_distribution<> dImage(0, images.size()-1);

   QStackedWidget display;
   QPushButton ready("I'm Ready!");
   QLabel label, labelHidden;
   display.addWidget(&ready);
   display.addWidget(&label);
   display.addWidget(&labelHidden);

   QTimer splashTimer;
   QStateMachine machine;
   QState s1(&machine), s2(&machine), s3(&machine), s4(&machine);
   splashTimer.setSingleShot(true);

   QObject::connect(&s1, &QState::entered, [&]{
      display.setCurrentWidget(&ready);
      ready.setDefault(true);
      ready.setFocus();
   });
   s1.addTransition(&ready, "clicked()", &s2);

   QObject::connect(&s2, &QState::entered, [&]{
      label.setPixmap(QPixmap::fromImage(images.at(dImage(gen))));
      display.setCurrentWidget(&label);
      splashTimer.start(250 + std::uniform_int_distribution<>(1500, 3000)(gen));
   });
   s2.addTransition(&splashTimer, "timeout()", &s3);

   QObject::connect(&s3, &QState::entered, [&]{
      display.setCurrentWidget(&labelHidden);
      splashTimer.start(2000);
   });
   s3.addTransition(&splashTimer, "timeout()", &s4);

   QObject::connect(&s4, &QState::entered, [&]{
      display.setCurrentWidget(&label);
      splashTimer.start(3000);
   });
   s4.addTransition(&splashTimer, "timeout()", &s1);

   machine.setInitialState(&s1);
   machine.start();
   display.show();

   return a.exec();
}