Как пользовательский виджет Qt уведомляет родителя ScrollArea об изменении представления - PullRequest
1 голос
/ 18 мая 2011

Я пишу программу просмотра изображений как пользовательский виджет Qt (см .: https://github.com/dov/Qviv)), и теперь я застрял в вопросе о том, как заставить мой виджет уведомлять родительский QScrollArea об изменениях в порте представления, итаким образом, чтобы сказать ему, чтобы переместить полосы прокрутки. Например, если средство просмотра изображений изменяет коэффициент масштабирования в результате нажатия клавиши, то полосы прокрутки должны изменить свой размер страницы.

Один из способов сделать это будет иметьВиджет явно проверяет, является ли родительский объект QScrollArea, а затем делает явный вызов его методов, чтобы уведомить его о любых изменениях.

Конечно, мне также необходимо подключить изменения ScrollArea к внутреннему представлению изображения., но это другой вопрос. И мне нужно сократить бесконечную рекурсию, когда виджет сообщает об изменениях на полосе прокрутки, которая сообщает об изменениях виджету и т. д.

Редактировать 20:15 среда (GMT / UTC) пытаюсь разъяснить Vjo и себе, что мне нужно.

То, что я пытаюсь достичь, является эквивалентом виджета Gtkему была назначена пара настроек GtkAdjustment, которые подключены к горизонтальной и вертикальной полосе прокрутки.В моем виджете GtkImageViewer, на котором основан QvivImageViewer, всякий раз, когда я меняю представление из-за какого-то внутреннего события (например, нажатия клавиши), я обновляю GtkAdjustment.Полосы прокрутки связаны с такими изменениями и обновляются соответственно.GtkImageViewer также прослушивает изменения GtkAdjustment, и, таким образом, если пользователь прокручивает полосы прокрутки, GtkImageViewer обновляется с этой информацией и может изменить свое представление.Мой вопрос заключается в том, есть ли что-то похожее на GtkAdjustment в Qt, к которому вы можете подключиться для изменений и обновления, и в этом случае обновление будет распространено на всех слушателей?

Таким образом, я не ожидаю, что ScrollAreaбыть частью QvivImageViewer, но если пользователь поместил QvivImageViewer в ScrollArea, я хочу двунаправленную связь с ним, чтобы полосы прокрутки отражали внутреннее состояние виджета.

Ответы [ 3 ]

1 голос
/ 20 мая 2011

Я наконец скачал источники Qt и исследовал, как QTextEdit делает это. Я обнаружил, что QTextEdit наследует QAbstractScrollArea сам по себе, и поэтому область прокрутки и полосы прокрутки являются частью виджета. Это отличается от Gtk, который использует более высокий уровень абстракции, через его GtkAdjustment, которые используются для сигнализации изменений между полосами прокрутки и виджетом. Модель Qt проще, и именно так я буду реализовывать ее в своем виджете.

1 голос
/ 27 января 2015

Это было давно, но я столкнулся с той же проблемой.

Вы можете унаследовать QAbstractScrollArea, если хотите, но QScrollArea также будет работать.

ВашПользовательский внутренний виджет (то есть тот, который вы прокручиваете) должен делать следующее при изменении его размера:

void MyCustomControl::resize_me() {
  // recompute internal data such that sizeHint() returns the new size
  ...
  updateGeometry();
  adjustSize();
}

QSize MyCustomControl::sizeHint() {
  return ... ; // Return my internally computed size.
}

Я пропустил вызов adjustSize(), и без него QScrollArea будет игнорировать размеризменения внутреннего виджета.

1 голос
/ 18 мая 2011

Самое простое - отправить событие QResizeEvent из вашего объекта виджета в объект QScrollArea.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...