Qual é a melhor maneira de fazer um células QTableView têm cima e para baixo empurrado estados do botão em Qt?

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

Pergunta

Eu estou tentando fazer as células de um olhar QTableView como botões clicáveis ??3D. De modo que quando você clica em uma célula, o botão olhares empurrado. Todo mundo parece pensar que eu simplesmente quer mudar a cor, eu preciso mostrar imagens de um botão normal, e um botão pressionado, aquele olhar 3-dimensional.

Eu tenho feito isso já com a chamada QTableView::setItemDelegate(), com um ItemDelegate apropriado que vai mudar o fundo da célula quando ele é clicado. No entanto, eu estou preso neste momento, porque eu quero algumas células ser diferentes botões coloridos com base nos dados que eles contêm. Assim, uma célula com um número baixo seria um botão vermelho, que também é vermelho quando é clicado, e as outras células seriam cores diferentes.

Eu posso definir a cor do botão com o TableModel, mas uma vez que o botão é clicado, não há nenhuma maneira para o ItemDelegate saber que é suposto ser uma cor diferente do que o resto. Como você pode ligar os dois para que o ItemDelegate sabe que cor ele é suposto ser?

Além disso, existe apenas uma maneira melhor de fazer as células parecem com botões?

Foi útil?

Solução

Você pode chamar QModelIndex::model() de dentro método ItemDelegate do paint(), uma vez que tem um parâmetro QModelIndex. Isso lhe dá a TableModel para os dados, que pode ser programaticamente decidir o que cor do botão da célula será.

No entanto, isso ainda não é tão elegante como eu espero. Alguém sabe a melhor maneira de alterar a aparência das células da tabela quando em ambos cima e para baixo estados Push Button?

Outras dicas

Por que você não perguntou o índice para a cor de fundo.

Algo assim ...

QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) ); 
//...

Tenho a sensação de que é um bug em Qt e seu deve ter sido ...

// model code  
if(role==Qt::BackgroundColorRole )
    return qvariant_cast<QBrush>( QBrush(Qt::red) );

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );

Porque o optionV4.backgroundBrush está correto no método sizeHint mas é inválido no método paint. Agora vejo razão pela qual o sizeHint devem ter a escova fundo eo método paint não. Vou denunciá-lo à Nokia.

EDIT:
Parece que eu estava certo e é um bug no QStyleOptionViewItemV4 não copia o ícone e backgroundBrush

Você não pode começar a contagem ID / linha da linha da célula da tabela e, em seguida, verificar se contra a tabela de cores que você pode estar tendo, e definir a cor de acordo? Eu não tenho certeza se eu entendi bem ou não a sua pergunta.

Atribuir um papel de dados para a cor de fundo e na sua delegado item, pedir o índice modelo que vale a cor de fundo é (usando data( bg_color_role ) ou algo similar). Então, em seu modelo, você precisa ter certeza de que a função de dados retorna uma cor para o bg_color_role que é apropriado para os dados que está sendo modelado.

A maneira de fazer isso é usar o método de dados do objeto QModelIndex você começa no método de pintura, e pedir um papel específico (se você definir um modelo personalizado, você pode adicionar os seus próprios papéis, e dar as informações você precisa para o delegado nesses papéis.)

TimW, eu acho que você tem que preencher a informação QStyleOptionViewItemV4 chamando initStyleOption antes.

Eu não tenho certeza de onde a exigência de uma imagem de fundo vem. Se você quer que as células se parecem com QPushButtons, você provavelmente deve herdar de QItemDelegate e implementar paint() ao uso QStyle para chamar-lhe uma QPushButton, algo como isto:

QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );

Você já tentou usar folhas de estilo personalizado?

Você pode simplesmente aplicar o mesmo estilo de todas as células, e em seguida, mudar a imagem de fundo / estilo para desenhar as imagens de botão 3D, dependendo se é ou não está selecionado.

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