- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在执行一个函数时显示一个繁忙的等待栏,我的问题是一旦函数启动它就停止移动。
MyProgressDialog *progBar= new MyProgressDialog();
QProgressBar* bar = new QProgressBar(progBar);
bar->setRange(0, 0);
bar->setValue(0);
progBar->setBar(bar);
QString labeltext=QString("<qt> <center><big><b>%1</b></big></center> <br><b>%2</b><br> %3 <br><b>%4</b><br> %5</qt>")
.arg(progBar->labeltext)
.arg("File in :")
.arg(FileI)
.arg("File out :")
.arg(FileO);
progBar->label->setText(labeltext);
progBar->setValue(10);
progBar->show();
progBar->setValue(20);
Sleep(500);
progBar->setValue(50);
Sleep(500);
MyFunction(FileI,FileO,mode,key);
Sleep(500);
progBar->setValue(80);
Sleep(500);
progBar->setValue(100);
progBar->close();
delete bar;
delete progBar;
我用 sleep 扭曲我的函数并设置值,目的是让它移动但徒劳无功,当我删除它们时,MyProgressdialog 没有显示其内容,我是否需要在单独的线程中使用我的函数? 我尝试使用 QFutureWatcher:
QFutureWatcher<void> futureWatcher;
QFuture<void> f1 = run(
MyFunction,
filePath,
file.absolutePath()+"/OUT_"+fileN,
1,
key
);
QObject::connect(&futureWatcher, SIGNAL(finished()), progBar, SLOT(reset()));
QObject::connect(progBar, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int,int)), progBar, SLOT(setRange(int,int)));
QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), progBar, SLOT(setValue(int)));
// Start the computation.
futureWatcher.setFuture(f1);
// Display the dialog and start the event loop.
progBar->exec();
futureWatcher.waitForFinished();
delete progBar;
当我只调用 MyFunction 一次(针对一个文件)时,它工作正常并且我的条在移动,但是当我多次调用 MyFunction 时(连续针对许多文件)出现问题:它工作但我得到相同的 OUT_file对于所有处理过的文件,我认为这是多线程问题。
编辑: class MyProgressDialog
class MyProgressDialog: public QProgressDialog
{
Q_OBJECT
public:
MyProgressDialog()
{
qDebug()<<"MyProgressDialog constructor";
label=new QLabel(this);
QPalette* palette = new QPalette();
palette->setColor(QPalette::Window,"#F8F8FF");
setPalette(*palette);
QFont* font = new QFont("Courier New");
font->setItalic(true);
font->setPixelSize(15);
setFont(*font);
adjustSize();
setWindowIcon(QIcon(QApplication::applicationDirPath()+"/icons/icon1.png"));
setWindowFlags(Qt::WindowStaysOnTopHint);
setMinimumWidth(500);
setMinimumHeight(200);
labeltext=QString("Please wait until Encryption/Decryption was done");
label->setText(labeltext);
label->adjustSize();
label->setWordWrap (true);
setLabel(label);
setRange(0,100);
setWindowTitle("MyFunction progress");
setModal(true);
}
~MyProgressDialog()
{
qDebug()<<"MyProgressDialog destructor";
delete label;
}
public:
int value;
QString labeltext;
QLabel* label;
};
最佳答案
Qt 中的 UI 是事件驱动的。因此,在与 ui 相同的线程中执行您的代码将阻止每个 ui 事件,直到您的函数完成。有两种显示进度的方法。
setValue
和 show
调用之后调用 QApplication::processEvents();
静态方法。调用 QApplication::processEvents()
将调度当前在事件循环中排队的事件。这些事件包括所有 ui 相关事件这是 gcc/mingw gcc 的代码示例
#include <QApplication>
#include <QProgressBar>
int main(int argc, char * argv[])
{
QApplication app(argc, argv);
QProgressBar bar;
bar.setRange(0, 100);
bar.show();
app.processEvents();
usleep(250000);
for(int i = 1; i <= 10; ++i)
{
bar.setValue(i * 10);
app.processEvents();
usleep(250000);
}
return 0;
}
它显示进度条并每 0.25 秒步进 10
您的代码应如下所示:
MyProgressDialog *progBar= new MyProgressDialog();
QProgressBar* bar = new QProgressBar(progBar);
bar->setRange(0, 100); // note your "busy state won't be shown as you're changing value right after show
bar->setValue(0);
progBar->setBar(bar);
QString labeltext=QString("<qt> <center><big><b>%1</b></big></center> <br><b>%2</b><br> %3 <br><b>%4</b><br> %5</qt>")
.arg(progBar->labeltext)
.arg("File in :")
.arg(FileI)
.arg("File out :")
.arg(FileO);
progBar->label->setText(labeltext);
progBar->setValue(10);
progBar->show();
QApplication::processEvents(); // HERE
progBar->setValue(20);
QApplication::processEvents(); // HERE
Sleep(500);
progBar->setValue(50);
QApplication::processEvents(); // HERE
Sleep(500);
MyFunction(FileI,FileO,mode,key);
Sleep(500);
progBar->setValue(80);
QApplication::processEvents(); // HERE
Sleep(500);
progBar->setValue(100);
progBar->close();
QApplication::processEvents(); // HERE
delete bar;
delete progBar;
关于c++ - QProgressdialog : busy waiting bar is not moving while function is executing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13229308/
我正在使用 QProgressDialog,它显然只显示进度并且它会沿途递增。当它达到 100% 时,其上的进度条将重置为零,而不是之后显示 100%。 progress是类的成员变量。 QShare
我在使用我的应用程序上的 QProgressDialog 时遇到了一些问题。 当用户点击计算按钮时,我会显示一个从 QThread 更新的 QProgressDialog(我认为这与问题无关),当这个
我想从我的工作线程更新一个modal QProgressDialog。但是,如果我将对话框设置为模态,我的应用程序就会崩溃(并且对话框没有显示任何进度)。如果我不这样做,一切都会顺利(但用户可以修改程
我正在使用 QProgressDialog 来显示从 QTreeView 中的数据库加载数据的进度。我使用信号和槽来发送记录数和当前记录。这是插槽代码: void MainWindow::loadDa
我正在运行处理器繁重的操作并使用 QProgressDialog 向用户报告。然而,取消按钮工作不稳定 - 有时它在整个运行过程中被忽略,有时它会响应,但仅在进度的某个点之后(这一点也不一致)。在我看
我有一个根据MVC模型设计的程序。我的 View 有一个 open 按钮,我可以在其中打开文件。文件被解析,并根据文件内容完成大量计算。 现在我想显示一个加载程序来指示用户应该等待。我对 Python
我有理由在循环中使用 QProgressDialog,我希望对话框弹出并等待用户输入,然后再显示对话框。然而,在第二次循环中,对话框一直保持匿名,直到它开始正确更新。下面是一些示例代码: QProgr
这个问题在这里已经有了答案: Disable QDialogs default close button (upper left "cross button")? (5 个答案) 关闭 9 年前。
我正在开发一个无法共享源代码的大项目。在那个项目中,我们在 Windows(不是在 ubuntu 中)中遇到了一些可重现的堆栈溢出错误,调试器的堆栈跟踪显示进度对话框设置为窗口模式,正在递归调用 QP
我有一个简单的程序,我希望有一个远程更新的模式、非阻塞进度窗口(使用 QProgressDialog)。 SIZE 只是控制 QProgressDialog 的最大值。但是,如果我将它的值设置为 4
progress = QtGui.QProgressDialog("Parsing Log", "Stop", 0,numberOfLinesInFile , self) progress.s
我正在使用 QT 4.8.5。我在带有 MinimumDuration 的 QProgressDialog 上遇到了一些问题。这是文档:http://doc.qt.io/qt-4.8/qprogres
从 MFC 应用程序启动 Qt 应用程序时,我在显示模态 Qt 对话框时遇到问题。具体来说,当我将其父级设置为 QWinWidget 实例时,QProgressDialog 实例将不会显示在 MFC
我刚刚编写了一些基于 QThread 的代码来执行大型计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式的(使用 open()),因为我不想在计算期间修改主窗
我正在从线程调用 QProgressDialog 并且无法将其设置为模态窗口,即使我将 setModal 设置为 true。我希望在 QProgressDialog 运行时阻塞主窗口。 以下是我的一段
我正在使用 subprocess.call 来运行需要一段时间(>5 分钟)才能运行的命令提示符命令: subprocess.call([command, param1, param2], cwd=c
我正在使用 QProgressDialog 来显示我的 initializeGL() 函数的进度,但是小窗口显示为未绘制...这是简化的代码: QProgressDialog barTest("Wai
主 GUI 线程在等待 QFuture 时更新 QProgressDialog 的正确方法是什么。具体来说,这个循环中发生了什么: QProgressDialog pd(...); QFuture f
有时我的 QProgressDialog 显示,有时它根本不显示(好像没有调用 processEvents)。 processEvents() 命令是否存在任何可能导致 QProgressDialog
考虑这个 SLOT ,在我的主线程中,由一个按钮触发,该按钮采用 QTreeWidgetItem 的列表来自QTreeWidget .它使用 QtConcurrent::map()调用来执行一个长任务
我是一名优秀的程序员,十分优秀!