【问题标题】:CFileDialog as child of QWidgetCFileDialog 作为 QWidget 的子级
【发布时间】:2011-07-25 18:58:26
【问题描述】:

是的,我知道,不应该混合不同的平台,但是我正在开发一个 Qt 应用程序,现在我们有一个新要求:应该使用标准的 Windows 打开文件对话框来代替 QFileDialog。

所以我想创建一个作为 QWidget 子级的 CFileDialog。我发现了一个与逆问题相关的问题:QWidget as a child of an existing MFC component but nothing about my specific issue.

我的计划是写一个包装类

class FileStdWDialog : CFileDialog

使用构造函数

FileDirStdWDialog(QWidget *parent, ...);

并将其映射到对超类构造函数的调用

CFileDialog(..., ..., ..., ..., ..., CWnd* pParentWnd, ...)

所以,如果我理解正确,我的问题归结为映射 一个 QWidget * 到一个 CWnd *。您知道是否有简单的方法可以做到这一点?

更新

感谢您的提示。可能,为 QWidget 获取 HWND 和 将其转换为 CWnd * 是正确的解决方案。我会试试这个方法。

【问题讨论】:

  • 这个问题在内部不一致——如果你想打开一个标准的 Windowws 打开文件对话框,那么就这样做,在这种情况下,QWidget 既不是父项也不是子项:对话框是独立的。
  • 我对 MFC 了解不多,因为有一个参数 pParentWnd,我想我应该为它提供一个值。我会尝试使用 NULL,也许它可以工作。
  • 除非您需要一些 Qt 未公开的 windows 文件对话框的特殊功能,否则您可以只使用静态 QFileDialog 函数,它们将使用平台标准文件对话框.. 看看在此:http://doc.qt.nokia.com/latest/qfiledialog.html#details

标签: qt mfc integration


【解决方案1】:

您可以致电::GetOpenFileName::GetSaveFileName。我认为这些是 CFileDialog 包装的 Win32 函数。所以你不需要 MFC。

顺便说一句,从 Windows Vista 开始,建议使用Common Item Dialog,而不是标准的打开和保存对话框。

【讨论】:

  • 我查看了文档。据我了解 GetOpenFileName() 需要一个 OPENFILENAME 结构。这个结构有一个字段 HWND hwndOwner;我想我在这里也有同样的问题(?)
  • 尝试传递 NULL,看看会发生什么。医生说你可以做到。
  • @Giorgio 我从未使用过 Qt,但我怀疑如果小部件是在 Windows 环境中运行的“窗口”,它们必须具有 HWND。所以我用谷歌搜索并找到了this,它基本上说,“在 Windows 上,WId 是 typedef HWND”。所以如果你真的需要它,你确实有一个 HWND。
  • @Giorgio 如果一个答案回答了您的问题,您应该“接受”它(单击它旁边的勾号)。这是网站礼仪的一部分,而且它会奖励您一些声誉。
  • 我仍在尝试应用答案并遇到了一些问题。使用 Qt 静态函数并没有帮助,因为我需要一个可以选择文件或文件夹的对话框。 Qt 静态函数只允许两者之一。我也没有设法将解决方案与 WId 一起应用,因为据我所知,转换为 CWnd * 并不总是可能的 (CWnd::FromHandlePermanent()) 或安全的 (CWnd::FromHandle())。我仍在谷歌上寻找答案。完成后我会更新主要问题并接受答案。
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多