我试图通过允许Qt显示页码(在页脚的某处)来增强Qt的QPrintPreviewWidget。不幸的是,如果不了解Qt的源码,我不知道该怎么做。我发现这个额外的代码(在qpaintengine_preview.cpp中,在newPage()方法中)有一个很好的位置,但这意味着我将不得不重新编译整个Qt (我从Trolltech得到了一个二进制构建)。此外,如果我决定在别人的机器上运行一个使用此功能的应用程序,我也将不得不在那里重新编译(假设它是一个不同的arch)。
有没有其他更干净的方法?
谢谢
发布于 2009-11-26 22:53:09
newPage()方法是虚的吗?如果是这样的话,你可以子类化并在你自己的应用程序中使用它,这会更容易一些。
第二种选择是静态地将可执行文件与修改后的Qt库链接起来。要做到这一点,您需要意识到许可问题。这样,你放置应用程序的每个地方都会有你修改过的功能。(您仍然需要针对不同的体系结构重新编译。)
最后,您可以从http://qt.gitorious.org/获取最新的源代码,以您希望的方式对其进行修改,然后将补丁提交回巨魔。如果这样做,您可能不得不保留旧的行为作为默认值,并添加一个选项来启用新的行为。他们可能接受也可能不接受补丁。如果他们确实接受了补丁,你可能在相当长的一段时间内都不能依赖于其他人的计算机获得这个版本。
发布于 2009-12-07 02:05:53
阅读源代码。
在这种情况下,请阅读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。
现在,如果您想在已经部署的二进制文件上修改小部件的行为,事情就会变得更加丑陋。在这种情况下我帮不上忙。
发布于 2009-11-30 16:29:12
如果你有一个库,并且这个库有运行时链接器正在寻找的相同的符号--来获得打印预览的代码--那么你可以注入你自己的代码来替换真正的实现。方法称为dll注入。
有关更多信息,请查看http://en.wikipedia.org/wiki/DLL_injection
https://stackoverflow.com/questions/1800272
复制相似问题