我正在尝试通过允许它显示页码(在页脚的某处)来增强Qt的QPrintPreviewWidget。不幸的是,我无法弄清楚如何在不破坏Qt的源头的情况下解决这个问题。我看到这个附加代码的一个很好的位置(在qpaintengine_preview.cpp中,在newPage()方法中)但这意味着我将不得不重新编译整个Qt(我从Trolltech获得了二进制构建)。此外,如果我决定在其他人的盒子上运行一个使用此功能的应用程序,我将不得不在那里重新编译(如果它是一个不同的拱门)。
还有其他更清洁的方法吗?
由于
答案 0 :(得分:2)
newPage()方法是虚拟的吗?如果是这样,您可以在自己的应用程序中进行子类化并使用它,这会更容易一些。
第二个选项是将您的可执行文件与修改后的Qt库静态链接。您需要了解许可方面的问题才能执行此操作。这样,您放置应用程序的每个位置都将具有您修改的功能。 (您仍然需要针对不同的体系结构重新编译。)
最后,您可以从http://qt.gitorious.org/获取最新资源,以您希望的方式修改它们,然后将修补程序提交给巨魔。如果执行此操作,则可能必须将旧行为保留为默认行为,并添加选项以启用新行为。他们可能会也可能不会接受补丁。如果他们确实接受了补丁,那么你可能无法依赖其他人的计算机获得该版本一段时间,如果有的话。
答案 1 :(得分:1)
阅读源代码。
在这种情况下,请阅读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
。
现在,如果要修改已部署的二进制文件上的窗口小部件的行为,事情会变得更加丑陋。在这种情况下我无能为力。
答案 2 :(得分:0)
如果你有一个库,并且这个库在运行时正在寻找相同的符号 - 获取打印预览的代码 - 那么你可以注入自己的代码来替换真正的实现。方法称为dll注入。