问题标签 [qt-mfc-migration]

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.

0 投票
1 回答
1861 浏览

c++ - Qt 选项卡小部件中的 MFC 控件

我正在开发一个使用Qt/MFC 迁移框架的项目,并且我正在尝试在 Qt 对话框中重用一些现有的 MFC 控件。

有谁知道是否可以在 QTabWidget 中插入 MFC 控件(CDialog 或 CWnd)。现在我们正在做相反的事情,我们有一个带有选项卡控件的 MFC 对话框,其中填充了 MFC 选项卡 (CDialog) 和 Qt 选项卡 ( QWinWidget ) 的混合。但是,这种方法让我很头疼,因为 QWinWidget 控件没有正确绘制,也没有正确接收焦点或键盘输入。我希望使用带有 QTabWidget 的 Qt 对话框会比这种方法更好。

0 投票
4 回答
2112 浏览

c++ - MFC 对话框中的 QWinWidget 不重新绘制或响应 Tab/箭头键

我在 MFC 对话框中使用QWinWidget,并且 QWinWidget 没有正确绘制自身,也没有正确处理键盘输入。

重新粉刷 [未解决]

在 QWinWidget 中,我有一个 QTableWidget。当我滚动 QTableWidget 时,它不会重绘自身,直到我停止滚动,此时它会重绘所有内容。同样,我可以在 QTableWidget 中的单元格中键入内容,并且控件不会更新,直到我通过向上或向下滚动来强制它重新更新(它在滚动停止时重新更新)。

由于此 QWinWidget 位于 MFC CDialog 中,因此我尝试覆盖 CDialog 的 OnPaint 方法并仅调用 QWinWidget::repaint 方法,但是这有相反的问题,现在只有 QWinWidget 被更新并且 CDialog 从未重绘,从而导致伪影. 如果我调用 QWinWidget::repaint 和 CDialog::OnPaint,结果与不覆盖 OnPaint 方法相同。有没有人见过这个问题或知道如何解决它?

键盘输入 [已解决]

QWinWidget 中的所有控件都不能正确响应 tab 键或箭头键。制表符/箭头键只是跳过整个 QWinWidget(和所有子控件)。即使我在 QWinWidget 内部单击并选择了一个控件,下次我按 Tab 键时,它也会将焦点完全跳过整个 QWinWidget。

我注意到 QWinWidget 有两个函数,QWinWidget::focusNextPrevChild 和 QWinWidget::focusInEvent 并且它们都有一个注释标题说“\reimp”。我是否应该覆盖这些功能以获得正确的选项卡功能?如果是这样,如何实现这些功能以获得正确的选项卡功能。

0 投票
0 回答
1141 浏览

qt - 使用嵌入的 QWinWidget 调整 Mfc 对话框的大小

我在qt中心论坛上问了我的问题,但还没有答案。
希望有人会对此有所了解。

我有一个 Mfc 对话框,里面有 QWinWidget。当我调整对话框大小时,我希望 QWinWidget 也自动调整大小和重新定位。这是在 mfc 对话框中创建 QWinWidget 的代码:

MyFrame 派生自 QFrame 对象。QFrame 对象是用 Qt 设计器制作的。QFrame 已分配布局,它假设对 QFrame 子小部件进行几何管理。

这是当我拖动对话框的调整大小边框时执行的代码:

当对话框调整大小时,我从 OnSize 调用我的框架对象的调整大小方法,并且我期望在我调整到框架的大小之后,框架应该根据它们的大小提示和大小策略调整其子小部件的大小和重新定位。但这并没有发生,至少不是它应该发生的。我做错了什么?

0 投票
1 回答
865 浏览

qt - 使用打开的 Qt 对话框最小化 Mfc 应用程序

我正在使用 QtWinMigrate 解决方案来显示来自第三方 Mfc 应用程序中加载的插件 dll 的对话框。问题如下:

当我最小化我的 Mfc 应用程序的主窗口并再次恢复它时,我所有打开的 Qt 对话框都丢失了。我发现实际上我的 Qt 对话框被破坏了,即调用了析构函数。

我做了一些调试,发现了以下内容:

当我关闭我的 Mfc 主窗口时,我的 Qt 对话框收到带有 SW_PARENTCLOSING wparam 参数的 WM_SHOWWINDOW 消息。然后调用 QtWndProc,对于 SW_PARENTCLOSING 案例问题,它会发送 QHideEvent:

在文件 qapplication_win.cpp 第 2160 行中的 QtWndProc() 函数中

QWinWidget 的 eventFilter 发送 DeferedDelete 删除我的对话框:

在第 280 行的 QWinWidget.cpp

}

有人可以向我解释这种行为吗?这对我来说似乎是错误。

谢谢

0 投票
1 回答
526 浏览

qt - 删除 QWinWidget

我正在使用 mfc 到 Qt 迁移,并且在我的 Mfc 应用程序中显示 Qt 对话框。可以在其 winEvent 处理程序中 deleteLater QWinWidget 吗?问题是我希望在关闭主 mfc 窗口时自动删除 My Mfc 应用程序中所有打开的 Qt 对话框。由于将为所有子窗口(以及 Qt 小部件)发送 WM_DESTROY,因此我在 QwinWidget winEvent 处理程序中添加了以下代码:

有人可以评论一下吗谢谢

0 投票
1 回答
2021 浏览

winapi - DllMain 和 Qt Mfc 迁移

我正在使用 Mfc 到 Qt 迁移解决方案,将我的 Mfc 插件迁移到 Qt。我的 Mfc 插件已加载到第三方 Mfc 应用程序中。基本上我正在使用以下基于 Qt 的应用程序扩展示例:

我阅读了Qt Sources中pluginInstance函数的代码,并注意到pluginInstance在里面调用了LoadLibrary和SetWindowsHook。

到目前为止一切正常。但我有以下担忧:禁止从 user32.dll 调用 LoadLibrary 和函数,如 DllMain 中的 SetWindowsHook。我在 DllMain 的 msdn 文档中读到了这一点。那么,如果这是不安全的,为什么官方 Qt 站点说要在 DllMain 中调用 pluginInstance?基于 Qt 的应用程序扩展 也许我遗漏了一些东西

0 投票
2 回答
510 浏览

qt - QWinWidget 的位置始终为 0(零)

我在 CView 中托管了一个 QWinWidget,并希望它在调整大小时保持在指定位置。但是QWinWidget总是移动到(0, 0),即CView的左上角。

我尝试以这种方式调试:

请注意:pos 始终为 (0, 0)。

这是为什么?

0 投票
1 回答
2194 浏览

qt - 我可以将 Qt 对象直接绘制到 Win32 DC(设备上下文)吗?

我可以将 Qt 对象绘制到 QImage,然后将图像绘制到 HDC 或 CDC。这可能会损害我们应用程序的性能。如果我可以将 Qt 对象直接绘制到 Win32 HDC 或 MFC CDC,那就太好了。我希望有一个类,说 QWin32Image 清楚,然后我可以这样使用它:

我的想法可能吗?还是有更好的方法来做到这一点?

0 投票
0 回答
256 浏览

qt - 如何在 MFC 应用程序中打印 QGraphicsTextItem

我在 MFC 应用程序中使用 QGraphicsTextItem 进行文本编辑,然后将结果转换为位图以显示在视图(屏幕)中。但是打印的时候有问题。例如,如果我打印到 PDF 文件,文本是不可缩放的,因为它是位图并且文件大小也很大。

如何在 MFC 打印框架中打印 QGraphicsTextItem?理想的解决方案是我们可以将 QPrinter 挂接到 MFC 打印框架中,或者我可以使用 Win32 DC 初始化 QPrinter。MFC 打印框架为我准备了打印机和 DC,所以我不需要 QPrintDialog 再次执行该任务。代码可能是这样的:

那可能吗?我是否必须重新实现自己的 QPrinter?扫描 QPrinter 的源代码,我发现它非常复杂。我希望有一种简单的方法可以实现我的目标。如果我必须实现自己的 QPrinter,我需要注意什么?谁能给我一些建议?

0 投票
1 回答
1009 浏览

c++ - 无法在 MFC 应用程序中显示模态 QProgressDialog

从 MFC 应用程序启动 Qt 应用程序时,我在显示模式 Qt 对话框时遇到问题。具体来说,当我将 QProgressDialog 实例设置为 QWinWidget 实例时,它不会显示在 MFC 应用程序中。这是我的问题更详细...

我的 MFC 应用程序需要将大量数据传输到 Qt 应用程序,这是一个 DLL。Qt 应用程序在其 API 中包含一个 ProgressDlg 类,该类在后台使用 QProgressDialog 实现。必须在初始化 Qt 应用程序的事件循环之前创建和更新此对话框,以便 MFC 应用程序可以更新其进度(QApplication::exec() 帮助说这可以通过模态小部件实现)。

如果不设置底层 QProgressDialog 的父级,进度条会按照我的预期进行更新,并且对话框在传输过程中保持响应,但我可以继续与 MFC 应用程序交互。

所以我尝试安装 Qt/MFC 迁移框架并将 QProgressDialog 的父级设置为 QWinWidget:

(其中 m_impl 派生自 QProgressDialog。)

然后在MFC端添加调用代码来创建对话框:

但是在设置父级时,QProgressDialog 不再出现。(我使用 ::FindWindow 检索了句柄,并传入了窗口名称,为了使场景进一步复杂化,我的 MFC 应用程序实际上是第三方可执行文件的插件 DLL。)

所有帮助表示赞赏。谢谢。