题
我正在尝试通过允许它显示页码(在页脚的某处)来增强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注入。