Pergunta

Eu tenho uma hierarquia simples de widgets: GraphWidget -> MotionWidget -> NodeWidget. Eu sou novo para o Qt, por isso não estou muito certo sobre como algumas entranhas trabalhar ainda. Basicamente, GraphWidget cria um único MotionWidget M e conjuntos de do M pai para si. M , em seguida, vai embora e cria um monte de NodeWidgets. No entanto, NodeWidgets nunca ter pintado nem sua paintEvent () função é chamada.

Eu tentei criar MotionWidget diretamente, sem GraphWidget e tudo funciona. Então porque é que as coisas quebram se eu adicionar GraphWidget à hierarquia?

Aqui está um colar com as partes relevantes do código do meu projeto. Eu também incluiu a saída do GraphWidget :: dumpObjectTree () na parte superior.

Edit: esqueceu-se de incluir o link pasta;) http://rafb.net/p/Zp39CF94 .html

Update:. Enrolei MotionWidget em um layout

Antes:

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    MotionWidget *n = new MotionWidget( 5, this );
}

Depois

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    QVBoxLayout *l = new QVBoxLayout;

    MotionWidget *n = new MotionWidget( 5 );

    l->addWidget( n );

    setLayout( l );
}

Agora, os últimos trabalhos. Ou seja, tudo é desenhado. A questão torna-se então ... Por quê? Por que não funcionou no primeiro caso, mas trabalhou no segundo?

Foi útil?

Solução

Vou discordar de Aiua resposta . Passando o pai para um objeto irá adicionar a criança a hierarquia visual. (Caso contrário, usando Designer de fazer um widget incluindo outros, mas com o posicionamento absoluto, não funcionaria.) No entanto, houve provavelmente outros fatores que mantêm a pintura de acontecer.

Devido ao fato de que o layout tornou as coisas trabalho, eu estou indo supor que, em ambas as versões, MotionWidget não tem tamanho definido. Isso significaria que no primeiro exemplo que iria ser dimensionados para 0x0 pixels, que Qt irão otimizar fora ao tentar pintar. No segundo exemplo, os controles de layout do tamanho dos widgets adicionados a ele, e assim seria ampliar MotionWidget, e, assim, ele iria começar a receber eventos de pintura novamente.

Para corrigir isso, você pode definir o tamanho explicitamente como você faz para GraphWidget, ou você poderia fazer alguma dinâmica dimensionamento com base no tamanho do pai, ou GraphWidget poderia controlar o tamanho, ou qualquer de um grande número de diferentes opções. Layouts pode ser bom também, mas não são absolutamente necessários.

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