Я отвечаю на C ++ здесь, так как это то, с чем я больше всего знаком, и ваша проблема не относится к PyQt.
Обычно вам просто нужно позвонить QWidget::updateGeometry()
, когда sizeHint()
мог измениться, точно так же, как вам нужно позвонить QWidget::update()
, когда содержимое могло измениться.
Однако ваша проблема в том, что sizeHint()
не изменяется при добавлении текста в QLineEdit
и QTextEdit
. По причине: люди не ожидают, что их диалоги будут расти по типу:)
Тем не менее, если вам действительно нужно поведение типа «расти как вы» в этих виджетах, вам нужно наследовать их и переопределять sizeHint()
и minimumSizeHint()
, чтобы вернуть больший размер, и, возможно, setText()
, append()
и т. д. для вызова updateGeometry()
, чтобы заметить изменение размера подсказки
Расчет sizehint не будет полностью тривиальным, и для QLineEdit
будет гораздо проще, чем для QTextEdit
(что тайно QAbstractScrollArea
), но вы можете взглянуть на sizeHint()
и minimumSizeHint()
реализации для вдохновения (также для QComboBox
, в котором есть режим, чтобы делать именно то, что вы хотите: QComboBox::AdjustToContents
.
РЕДАКТИРОВАТЬ: ваши два варианта использования (QTextBrowser без полос прокрутки и QLineEdit вместо QLabel только для выделения текста там) могут быть решены с помощью QLabel и достаточно недавнего Qt. QLabel получил как уведомление о щелчке по ссылке, так и так называемые «текстовые флаги взаимодействия» (одним из которых является TextSelectableByMouse) в Qt 4.2. Единственное отличие, которое мне удалось разглядеть, заключается в том, что загрузка нового контента не происходит автоматически, в нем нет истории, и в QLabel нет подсказок по микрофокусам (т. Е. Переход от ссылки к ссылке).