C++ qt显示1/4秒的图像
嘿,我曾多次尝试在显示图像时使用usleep或qt sleep来完成此操作,但有时(几乎每次)它会显示为白色,而不是图像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
基本上我希望它接受任何输入,表示我准备好了,然后在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();
}