Есть ли способ заставить DrawText() обновить ограничивающую прямоугольную область QPicture?

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

  •  16-09-2019
  •  | 
  •  

Вопрос

Рисование на QPicture следует обновить его ограничивающий прямоугольник.Вот так:

>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawRect(20,20,50,50)
>>> picture.boundingRect()
QRect(20,20,50,50)

Но если я нарисую на нем текст, ограничивающий прямоугольник не будет обновлен:

>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawText(10,10, "Hello, World!")
>>> picture.boundingRect()
QRect(0,0,0,0)

Очевидно, что это не обновляет ограничивающий прямоугольник.

Есть ли способ заставить его воспроизводить нарисованный текст или я должен сделать это вручную?(Не слишком сложно, но я надеюсь, что Qt сможет помочь мне здесь.)

Это было полезно?

Решение

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

Рисует заданный текст внутри предоставленного прямоугольника в соответствии с указанными флагами.Значение boundingRect (если не null) устанавливается равным тому, каким должен быть ограничивающий прямоугольник, чтобы заключить весь текст.

Рисовальщика QPainter.то drawtext (1), Рисовальщика QPainter.то drawtext (2)

Обновить:

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

Возвращает ограничивающий прямоугольник текста в том виде, в каком он будет отображаться при рисовании внутри данного прямоугольника с указанными флагами с использованием текущего установленного шрифта();т.е. функция сообщает вам куда будет выводиться функция DrawText() при задании тех же аргументов.

Если текст не помещается в пределах заданного прямоугольника с использованием указанных флагов, функция возвращает требуемый прямоугольник.

QPainter.boundingRect QPainter.Привязка

Я связался с boundingRect с помощью вывода QRectF, но эта информация применима и к другим версиям.

Итак, по сути, передайте результат QPainter.boundingRect() в параметр boundingRect метода QPainter.DrawText() (второй аргумент QRect).

Обновление 2:

Я ПРИНОШУ СВОИ глубочайшие ИЗВИНЕНИЯ за то, что был таким чертовски тупым.Я забыл, что DrawText работает по-другому в PyQt, чем в Qt.Ограничивающий прямоугольник ВОЗВРАЩАЕТСЯ функцией DrawText (не передается, как в Qt), и, кроме того, вы должны указать флаги выравнивания, прежде чем получите обратно ограничивающий прямоугольник.(Я даже включил p.end() в соответствии с комментарием Аарона Дигуллы):

pic = Qt.QPicture()
p = QtGui.QPainter(pic)
brect = p.drawText(10,10,200,200, QtCore.Qt.AlignCenter, "blah")
p.end()
print brect
print pic.boundingRect()

Вот выходные данные:

PyQt4.QtCore.QRect(100, 103, 20, 14)

PyQt4.QtCore.QRect(0, 0, 0, 0)

Таким образом, похоже, что вам придется установить ограничивающий прямоугольник самостоятельно, хотя, по крайней мере, он возвращается вам выводом метода DrawText() при передаче флагов.

Это не похоже на идеальное поведение, так как вам пришлось бы самостоятельно устанавливать ограничивающий прямоугольник.Я надеюсь, что у кого-то еще есть ответ, который вы ищете, но я подозреваю, что вы, возможно, захотите сообщить об этой ошибке.

Другие советы

Рисование не изменяет размер чего-либо в Qt.Основная причина заключается в следующем:

  • Компонент должен раскрасить сам себя
  • Краска запускает изменение размера
  • Изменение размера запускает рисование -> бесконечный цикл

Таким образом, изменение размера должно произойти на этапе верстки.После этого границы не должны меняться.

Чтобы решить вашу проблему, используйте QFontMetric, чтобы определить, насколько большим будет ваш текст во время создания вашего изображения или близко к нему, а затем измените его размер соответствующим образом.

[ПРАВИТЬ] Хм ...попробуйте вызвать end() перед запросом ограничивающей прямой.Если это работает, вы обнаружили ошибку (не вижу причины, по которой ограничивающий прямоугольник не должен существовать при добавлении элементов ...)

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