Изменение основных компонентов / виджетов Qt, рекомендации?[закрыто]
Вопрос
Я пытаюсь улучшить Qt QPrintPreviewWidget, разрешив ему отображать номера страниц (где-нибудь в нижнем колонтитуле).К сожалению, я не могу до конца понять, как это сделать, не взламывая исходный код Qt.Я вижу отличное место для этого дополнительного кода (в qpaintengine_preview.cpp, в методе newPage()), но это означает, что мне придется перекомпилировать весь Qt (я получил двоичную сборку от Trolltech).Более того, если я решу запустить приложение, которое использует эту функциональность, на чужом компьютере, мне придется перекомпилировать и там (скажем, если это другая arch).
Есть ли какие-нибудь другие более чистые способы?
Спасибо
Решение
Является ли метод 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.
Проверить http://en.wikipedia.org/wiki/DLL_injection для получения дополнительной информации