问题标签 [qprogressdialog]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 模态 QProgressDialog::setValue() 导致嵌套事件循环崩溃
我刚刚写了一些基于 QThread 的代码来执行一个大的计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式(使用 open()),因为我不想在计算期间允许修改主窗口。线程发出各种信号,允许在 GUI 和线程之间进行基于状态机的通信。
线程的工作对象发出的两个信号是“Progress”和“Finished”。如果发出“Progress”,我将使用 setValue() 更新 QProgressDialog。如果发出“Finished”,则对话框被销毁。
在计算结束时会发生以下情况:
- 发出“进度”事件 (100%)
- “完成”后直接发出
- 由于“进度”事件而调用 setValue(100)
- 因为对话框是模态的,所以 setValue() 调用 processEvents()
- processEvents() 传递“Finished”事件
- “Finished”事件导致 Dialog 在 setValue() 中间被销毁,从而导致崩溃
QProgressDialog 通过在 setValue() 中调用 processEvents() 来破坏我的架构。此外,我的编码约定禁止使用任何嵌套的事件循环(如在 exec() 等中)。
我有两个问题:
为什么模态对话框需要嵌套事件循环?从我的理解来看,阻止父窗口的输入似乎不需要这个。
是否可以以模态方式使用 QProgressDialog 但没有嵌套事件循环?
c++ - 如何在 OS X 上阻止 QProgressDialog 的“本机关闭按钮”?
我正在创建QProgressDialog
如下:
请注意,我使用该Qt::WindowCloseButtonHint
标志来禁用“本机关闭按钮”。它似乎在Windows上运行良好,但在OS X上却不行(在OS X上,关闭按钮仍然可用,用户可以关闭QProgressDialog
)。
我也用其他标志(例如Qt::WindowSystemMenuHint
,Qt::WindowTransparentForInput
)进行了测试,但没有一个能解决我的问题。
当然,我可以使用该Qt::FramelessWindowHint
标志来删除“窗口的整个边框”,但这不是我的目标,因为我只想禁用关闭按钮。
我可以使用什么窗口标志来禁用/阻止OS XQProgressBar
上的关闭按钮?
python - QProgressDialog only shows after long-running code is finished
I have a program designed according to the MVC model. My view has an open
button where I can open files. The files are parsed and a lot of calculation is done with the file contents.
Now I want to display a loader to indicate that the user should wait. I am totally new to Python and Qt. I am using PyQt5 (Qt 5.6.2) with Python 3.6.2.
I added the showLoader()
method to the openFiles()
method of my view:
This will display the Loader but it will appear after the file is loaded. Not even immediately after the file is loaded, but it will take an additional 1-2 seconds after everything is done (including some repainting of the Window)
I read a lot about threads so I assume the file parsing is blocking the progress loader which makes sense. I read that I should add the QProgressDialog
to a slot (I don't really know what that is) but this doesn't help me because I want the QProgressDialog
to be displayed after the QFileDialog
.
I also read something about adding QtWidgets.QApplication.processEvents()
to repaint the Window, but this didn't work for me (or I used it wrong).
So my questions are:
- How do I display the
QProgressDialog
when I call theshowLoader()
method? - Do I have to execute my calculations and file parsing in a different thread and if have to how do I do this?
- If I wanted to display some more information in the
QProgressDialog
like updating the text and the progress, how do I do this?
Further Question
The solution pointed out by @ekhumoro works fine. I see the loader and the files are parsed correctly. My problem is now that updating my existing MainWindow
does not work.
After executing the code I see a little window popping up but it is disappearing instantly. (I had a problem like this and it was about the C++ garbage collector in the background of Qt. But in my understanding the layout should keep a reference to the ParsedDataWidget
so this doesn't make sense for me.) Also the ParsedDataWidget
is a widget which should be added to the layout
"inline" and not appearing as a "window".
So what do I have to do in order to get the addParsedData
method to work?
Edit
I was trying some changings of the code. If I replace the ParsedDataWidget
with a QLabel
I get the following result:
If i close the window python crashes.
Solution
With some further research I found my problem: You should not use threads with PyQt, you should use SIGNALS
instead (written here)
So I changed the code of the worker, I added another SIGNAL
called finishedParsing
which is emitted if the loading is completed. This SIGNAL
holds the DataParser
. The could would look like this:
This works now!
c++ - 如何实现 QProgressDialog?
我尝试使用 aQProgressDialog
给用户一些关于一个长任务的进度的信息,同时允许他取消这个任务。
基本上,我有一个QDialog
带按钮的Compute
。QDialog
通过单击它,会在 my的父级成员上调用一个耗时的方法。这个方法需要一个回调来告诉调用者工作的进度。
问题是进度对话框在出现之前需要一些时间,并且不会立即考虑单击其Cancel
按钮。
很明显我的代码有问题,但是我不习惯 Qt,我尝试了很多东西。我可能需要一个单独的线程。
我的代码摘录:
c++ - 从工作线程更新的模态 QProgressDialog
我想从我的工作线程更新模态QProgressDialog。但是,如果我将对话框设置为模态,我的应用程序会崩溃(并且对话框没有显示任何进度)。如果我不这样做,一切都会好起来(但用户可以修改程序的其余部分,这可能会导致问题)。
我究竟做错了什么?
最小代码示例如下:
c++ - 如何在 QT 中制作模态 QProgressDialog?
我正在从一个线程调用 QProgressDialog,即使我将 setModal 设置为 true,也无法将其设为模式窗口。我希望在 QProgressDialog 运行时阻止主窗口。
以下是我的一段代码。
通用函数
QProgressDialog *progressBarDialog;
泛型函数.cpp
c++ - 忙碌模式下的 QProgressDialog 不更新
我有一个简单的循环,我正在执行不确定长度的操作。我设置了一个 QProgressDialogrange(0,0)
来触发其不确定的“忙碌”模式;在我的平台上,这通常会产生一个进度条,其手柄来回弹跳。即使精简到以下内容,对话框也会出现,响应“取消”按钮,但句柄在栏的末端被冻结在适当的位置并且不会循环。
显然,循环内部实际上发生了更多事情,但无论有没有内容,它的行为都是一样的;注释掉其他所有内容后剩下的内容与描述的一样。
为什么我的进度手柄没有来回弹跳?
pyqt5 - PyQT5/QT Designer - 带有信号/插槽的线程
我编写了一个 PyQt5 应用程序,用于在 SQL 数据库中搜索用户输入。一切正常,但我没有运气尝试添加一个工作线程来处理搜索过程并防止应用程序变得无响应。我正在使用 QT Designer 为 UI 生成代码,该代码由主窗口、用于输入的 QLineEdit 框和用于开始搜索的 QPushButton 组成。至于进度条(和用于停止搜索的取消按钮),我正在考虑两个选项:将其“锚定”在主窗口中,或者将其弹出在对话框中。在 QMainWindow 类中,我定义了一个获取用户输入的函数(set_validators)和一个处理搜索并显示结果的函数(save_pushed)。我了解信号/插槽的基础,并且查看了几个示例,但我不确定如何将它们组合在一起。部分问题是我认为的可变范围。任何人都可以提供一般指导吗?