Qual é a melhor maneira de fazer um células QTableView têm cima e para baixo empurrado estados do botão em Qt?
-
13-09-2019 - |
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?
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.backgroundBrus
h 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
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 QPushButton
s, 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.