将状态对话框添加到Qt项目

时间:2015-11-16 08:13:48

标签: c++ qt architectural-patterns

我正在制作开源文件管理器,能够根据名为Cryptofm的给定密码加密和解密文件/文件。您可以从here获取代码 - 第一个版本。我想在进度条达到最大值以关闭statusdialog之后添加状态对话框,表示加载屏幕和Dialog::encAll()插槽的进度条。我发现我必须首先递归地找到文件夹中所有文件的总大小(在TreeView上下文菜单选项Size中) - slot Dialog::dirSize()在函数Dialog::getSelectedTreeItemSize()的帮助下执行此操作,然后将进度条属性最大值设置为该值。总大小计算过程可能需要花费很多时间,因此我需要另一个对话框,其中一些内容正在移动以指示进程正在执行。整个事情应该是在Windows 7中粘贴大量文件夹的过程。

获得总大小的过程:

enter image description here

粘贴过程直到进度条达到总大小:

enter image description here

问题是几乎所有的函数,操作等都是在Dialog类中实现的,我无法使用线程 - 在dialog.h中添加QThread之后就像Dialog : public QDialog, public QThread一样(为了能够实现运行) ()方法)程序给出了一些错误:

  

C:\ Users \ niki \ Documents \ EncryptionProject \ dialog.cpp:41:错误:C2594:   '自变量' :来自' Dialog * const'的模糊转换到QObject   *'

     

C:\ Users \ niki \ Documents \ EncryptionProject \ dialog.cpp:46:错误:C2594:   '自变量' :来自' Dialog * const'的模糊转换到QObject   *'

     

C:\ Users \ niki \ Documents \ EncryptionProject \ dialog.cpp:51:错误:C2385:   模糊访问' connect'可能是'连接'在基地' QObject'   或者可以是' connect'在基地' QObject'

还有31个错误,所以:

  • 这里最好的选择是什么?
  • 我应该使用MVC还是其他模式?
  • 我应该使用线程吗?

2 个答案:

答案 0 :(得分:2)

我没有得到你的全部问题,但我可以给你一些提示。

错误“模糊转换”告诉您C ++无法将Dialog* const转换为QObject*。通常,您可以使用类似QObject* o = (QObject*) dialog的演员来解决此问题。您还尝试将指向const对象的指针转换为指向非const对象的指针。这是不可能的,因为const对象不受更改保护,而非const对象则不受保护。尝试删除const限定符或将其添加到QObject*

第一个屏幕截图中进度条的行为通常称为“不确定模式”。您可以通过将minimum和maxmimum值设置为0(使用pbar->setMaximum(0)pbar->setMinimum(0))来使用QProgressBar实现此行为。

关于线程的问题:是的,您应该使用工作线程来复制文件。使用UI线程(您可能在当前解决方案中使用)的问题是,UI将停止重新编码为用户输入(如移动窗口或按下按钮),并且您可能无法更新QProgressBar等UI元素并且用户无法看到您的进度。 您以错误的方式将QThread添加到您的程序中。您目前从QDialog(目前为止很好)和QThread(这就是问题)继承了您的自定义Dialog类。您应该使用new创建一个新的QThread实例,然后使用它调用方法,而不是从QThread中获取内容。你会在网上找到很多例子。

你可以使用MVC,但它会在你目前的情况下带来一些好处。虽然您可以创建处理文件操作的模型,但您在经典解释中也没有模型。

答案 1 :(得分:0)

我做了些什么。它看起来并不那么容易。我已经在新类中分离了所有执行代码,名为threadedController,并且moveToThread将它在mainWindow中移动到新线程。重要的是要注意这个类是继承QObject以便能够使用信号槽机制,它在构造函数中没有父节点,因为在其他情况下它无法移动到新线程。 QWidget对象无法在新线程中移动。似乎GUI线程和新线程之间的通信可以通过信号槽机制来实现。 Qt正在使用模型/视图架构。每个人都可以从here下载第二个版本的源代码和exe文件。