修改Qt核心组件/小部件,最佳实践?

时间:2009-11-25 22:08:37

标签: qt qt4 libraries

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

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

由于

3 个答案:

答案 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。由于这在某种程度上是私密的,它可能会破坏新版本。

创建一个展开QWidgetQFrame 的新课程

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

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

答案 2 :(得分:0)

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

查看http://en.wikipedia.org/wiki/DLL_injection了解详情