1

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

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

谢谢

4

3 回答 3

2

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

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

最后,您可以从http://qt.gitorious.org/获得最新的资源,按照您想要的方式修改它们,然后将补丁提交给巨魔。如果您这样做,您可能必须将旧行为保持为默认值,并添加一个选项以启用新行为。他们可能接受也可能不接受补丁。如果他们确实接受了该补丁,那么您可能在相当长的一段时间内都无法依赖其他人的计算机获取该版本(如果有的话)。

于 2009-11-26T14:53:08.790 回答
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. 由于这在某种程度上是私有的,因此它可以与较新的版本中断。

创建一个新类扩展QWidgetQFrame

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

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

于 2009-12-06T18:05:52.877 回答
0

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

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

于 2009-11-30T08:29:11.600 回答