Existe uma maneira de fazer drawText () atualizar rect delimitadora de um QPicture?

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

  •  16-09-2019
  •  | 
  •  

Pergunta

Drawing em um QPicture deve actualizar o seu rect delimitadora. Como esta:

>>> 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)

Mas se eu desenhar texto sobre ele, o rect delimitadora não é atualizado:

>>> 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)

Obviamente, ele não atualiza o rect delimitadora.

Existe uma maneira de torná-lo repsect texto elaborado ou eu tenho que fazê-lo manualmente? (Não é muito difícil, mas espero que Qt pode me ajudar aqui.)

Foi útil?

Solução

Dê uma olhada nestes métodos de sobrecarga, onde você deve especificar o Retângulo após o parâmetro de texto (que é aparentemente diferente do que o retângulo na posição do primeiro argumento):

Desenha o texto passado dentro do fornecida rectângulo de acordo com a sinalizadores especificados. O boundingRect (se não nulo) é definido para o que a retângulo delimitador deve estar em ordem para incluir todo o texto.

QPainter.drawText (1) , QPainter.drawText (2)

Update:

Parece se você deseja gerar um retângulo delimitador para a drawText () método com antecedência, basta chamar o método boundingRect () no QPainter, que faz o seguinte:

Retorna o retângulo delimitador da texto como ele aparecerá quando desenhado dentro do rectângulo com o dado bandeiras especificado usando o momento conjunto de fontes (); ou seja a função lhe diz onde o drawText () vontade função desenhar quando recebe os mesmos argumentos.

Não Se o texto se encaixa dentro do dada rectângulo usando o especificado bandeiras, a função retorna o retângulo necessário.

QPainter.boundingRect

I ligada a BoundingRect com saída QRectF, mas a informação se aplica às outras versões também.

Então, basicamente, passar o resultado da QPainter.boundingRect () para o parâmetro boundingRect do método QPainter.drawText () (o segundo argumento QRect).

Update 2:

Eu peço desculpas Profusamente por ser tão maldito densa. Esqueci-me que drawText funciona de maneira diferente em PyQt que em Qt. O retângulo delimitador é retornado pela função drawText (não passou em como Qt) e, além disso, você tem que especificar sinalizadores de alinhamento antes de obter um retângulo delimitador dado de volta para você. (Eu mesmo incluído o p.end () conforme o comentário de Aaron Digulla):

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()

Aqui está a saída:

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

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

Assim, parece que você terá que definir o retângulo delimitador-se, no entanto, pelo menos, é devolvido a você pela saída do drawText () método quando passando em bandeiras.

Este não parece ser o comportamento ideal, que você teria que definir o retângulo delimitador si mesmo. Espero que alguém tem a resposta que você está procurando, mas eu suspeito que você pode querer relatar este bug.

Outras dicas

Pintura não muda o tamanho de algo na Qt. A principal razão é a seguinte:

  • A componente tem se pintar
  • A pintura gatilhos um redimensionamento
  • Os gatilhos de redimensionamento Pintura -> loop infinito

Assim, o redimensionamento tem que acontecer durante a fase de layout. Depois disso, os limites não deve mudar.

Para resolver o problema, use QFontMetric para descobrir o quão grande é o seu texto vai ser durante ou perto da construção de sua imagem e, em seguida, redimensioná-la em conformidade.

[EDIT] Hm ... tentar acabar com call () antes de solicitar o rect delimitadora. Se isso funcionar, você encontrou um bug (não pode ver uma razão pela qual o rect delimitadora não deve existir como você adicionar elementos ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top