Изменение основных компонентов / виджетов Qt, рекомендации?[закрыто]

StackOverflow https://stackoverflow.com/questions/1800272

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь улучшить 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 для получения дополнительной информации

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top