我在更新进度条时的第一个天真就是在我的循环中包含以下几行,正在进行处理,制作如下:
while(data.hasMoreItems())
{
doSomeProcessing(data.nextItem())
//Added these lines but they don't do anything
ui->progressBar->setValue(numberProcessed++);
ui->progressBar->repaint();
}
Run Code Online (Sandbox Code Playgroud)
我认为repaint()在更新GUI时添加会使执行暂停,但显然它并不那么简单.看完问题后:
看起来我将不得不将数据处理放在不同的线程中,然后将来自数据处理线程的信号连接到GUI线程以更新进度条.我对GUI和线程缺乏经验,我想知道是否有人能指出我正确的方向,即我应该使用什么Qt类来实现.我猜我需要一个QThread对象,但我一直在查看QProgressBar文档,但它没有提出线程主题.
我必须从dll公开DLLStart和启动Qt GUI DLLStop.main中的正常(.exe)方法如下:
int main(int argc, char *argv[]) {
QApplication a(argc, argv); Dialog w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
问题是阻塞a.exec()调用,因为在dll中DLLStart需要立即返回(见下文).有什么解决方法吗?备注:问题是与" 向动态库添加Qt GUI "共享一些共同点,但它并不完全重复.
/** start module */
int __stdcall DLLStart(void) {
..
QApplication qaDll(ac, av); Dialog w;
w.show();
qaDll.exec();
return 0; // never reached
}
/** stop module */
void __stdcall DLLStop(void) { }
Run Code Online (Sandbox Code Playgroud) 这是我的代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
testApp w;
w.show();
TestClass *test = new TestClass;
QObject::connect(w.ui.pushButton, SIGNAL(clicked()), test, SLOT(something()));
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
TestClass.h
class TestClass: public QObject
{
Q_OBJECT
public slots:
void something()
{
TestThread *thread = new TestThread;
thread -> start();
}
};
Run Code Online (Sandbox Code Playgroud)
TestThread.h
class TestThread: public QThread
{
Q_OBJECT
protected:
void run()
{
sleep(1000);
QMessageBox Msgbox;
Msgbox.setText("Hello!");
Msgbox.exec();
}
};
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我会看到错误
必须在gui线程中创建小部件
我究竟做错了什么?请帮我.我知道我不能在另一个线程中改变gui,但我不知道qt中的构造.
我目前有一个formA,它使用从QDialog继承的另一个表单请求用户输入.使用QDialog :: exec提示表单.现在问题是formA会有多个实例,因此每当formA打开另一个表单时,整个应用程序都会阻塞另一个表单.目前我有这样的东西
if(formUserInputRequired->exec()==1) //Block until the user selects from a form
{
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让QDialog :: exec不阻塞整个应用程序我只是希望它只阻止它被调用的形式的实例或类似的东西,但绝对不是整个应用程序?
更新:我不需要阻止窗口.但是,我想知道用户何时完成另一种形式的输入,以便原始表单可以处理该数据