我正在尝试通过允许它显示页码(在页脚的某处)来增强Qt的QPrintPreviewWidget。不幸的是,我无法弄清楚如何在不破坏Qt的源头的情况下解决这个问题。我看到这个附加代码的一个很好的位置(在qpaintengine_preview.cpp中,在newPage()方法中),但这意味着我将不得不重新编译整个Qt(我从Trolltech获得了二进制构建)。此外,如果我决定在其他人的盒子上运行一个使用此功能的应用程序,我将不得不在那里重新编译(如果它是一个不同的拱门)。

还有其他更清洁的方法吗?

由于

有帮助吗?

解决方案

newPage()方法是虚拟的吗?如果是这样,您可以在自己的应用程序中进行子类化并使用它,这会更容易一些。

第二个选项是将您的可执行文件与修改后的Qt库静态链接。您需要了解许可方面的问题才能执行此操作。这样,您放置应用程序的每个位置都将具有您修改的功能。 (您仍然需要针对不同的体系结构重新编译。)

最后,您可以从 http://qt.gitorious.org/ 获取最新资料,按照你想要的方式修改它们,然后将修补程序提交给巨魔。如果执行此操作,则可能必须将旧行为保留为默认行为,并添加选项以启用新行为。他们可能会也可能不会接受补丁。如果他们确实接受了补丁,那么你可能无法依赖其他人的计算机获得该版本一段时间,如果有的话。

其他提示

阅读源代码。

在这种情况下,请阅读 QPrintPreviewDialog 源代码以了解它是如何做到的。这个标准对话框有导航按钮和当前页面显示,所以它可以做你想要的(也就是说,如果我真的明白你想要完成什么)。您正在寻找的方法如下(src / gui / dialogs / qprintpreviewdialog.cpp):

void QPrintPreviewDialogPrivate::_q_previewChanged()
void QPrintPreviewDialogPrivate::_q_navigate(QAction* action)
void QPrintPreviewDialogPrivate::updateNavActions()

基本上, _q_previewChanged()连接到 QPrintPreviewWidget :: previewChanged()信号。发出时,页码将使用从 QPrintPreviewWidget :: currentPage() QPrintPreviewWidget :: pageCount()获取的信息进行更新。

至于扩展 QPrintPreviewWidget 的行为,您可以尝试两种方法,它们都不需要量身定制的Qt版本:

扩展 QPrintPreviewWidget

在构造函数中,访问 layout()(它是一个异地使用的QVBoxLayout),添加页脚小部件,将 previewChanged()信号连接到更新页码并完成的插槽。这种方法的问题在于它依赖于存在的布局并且是 QVBoxLayout 。由于这在某种程度上是私密的,它可能会破坏新版本。

创建一个新类,扩展 QWidget QFrame

如果您不要求您的小部件是 QPrintPreviewWidget ,只需创建一个新的 QWidget 派生类,并将打印预览小部件和页脚添加到布局中,连接插槽等。使用派生的窗口小部件而不是 QPrintPreviewWidget

现在,如果要修改已部署的二进制文件上的窗口小部件的行为,事情会变得更加丑陋。在这种情况下我无能为力。

如果你有一个库,并且这个库在运行时正在寻找相同的符号 - 获取打印预览的代码 - 那么你可以注入自己的代码来替换真正的实现。方法称为dll注入。

查看 http://en.wikipedia.org/wiki/DLL_injection 了解更多信息

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top