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