¿Cuál es la mejor manera de hacer una TableView células tienen arriba y abajo del botón presionado a los Estados en Qt?

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

Pregunta

Estoy tratando de hacer que las células de un QTableView parecen botones se puede hacer clic en 3D. De modo que cuando se hace clic en una celda, las miradas botón pulsado. Todo el mundo parece pensar que simplemente quiero cambiar el color, necesito mostrar imágenes de un botón normal, y un botón presionado, que se ven en 3 dimensiones.

Lo he hecho ya con llamar QTableView::setItemDelegate(), con un ItemDelegate apropiado que va a cambiar el fondo de la celda cuando se hace clic en él. Sin embargo, yo estoy atascado en este punto porque quiero algunas células sean diferentes botones de colores en base a los datos que contienen. Así que una célula con un número bajo sería un botón rojo, que también es de color rojo cuando se hace clic en él, y las otras células podría ser de colores diferentes.

Puede configurar el color del botón con el TableModel, pero una vez que se hace clic en el botón, no hay camino para la ItemDelegate saber que se supone que debe ser de un color diferente que el resto. ¿Cómo se puede vincular los dos por lo que el ItemDelegate sabe de qué color se supone que es?

Además, es simplemente una mejor manera de hacer que las células parecen botones?

¿Fue útil?

Solución

Puede llamar desde dentro QModelIndex::model() método ItemDelegate del paint(), ya que tiene un parámetro QModelIndex. Esto le da la TableModel de los datos, que puede programáticamente decidir qué color será el botón de la célula.

Sin embargo, esto todavía no es tan elegante como yo espero. ¿Alguien sabe una mejor manera de cambiar la apariencia de las celdas de tabla, cuando tanto en el arriba y abajo de los estados botón de empuje?

Otros consejos

¿Por qué no le pedirá el índice del color de fondo.

Algo como esto ...

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

tengo la sensación de que es un error en Qt y su debe haber sido ...

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

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

Debido a que el optionV4.backgroundBrush es correcta en el método sizeHint pero no es válido en el método paint. Ahora veo razón por la sizeHint debe tener el pincel plano y no el método paint. Voy a informar a Nokia.

EDIT:
Parece que tenía razón y que es un error en QStyleOptionViewItemV4 no copia el icono y backgroundBrush

No se puede obtener el recuento de ID / fila de la fila de la celda de la tabla y luego compararla con la tabla de colores que usted pueda tener, y establecer el color en consecuencia? No estoy seguro de si he entendido bien o no su pregunta.

Asignar un rol de datos para el color de fondo, y en su artículo delegado, pida el índice modelo de lo que es el color de fondo es (utilizando data( bg_color_role ) o algo similar). Luego, en su modelo, es necesario asegurarse de que la función de datos devuelve un color para el bg_color_role que es apropiado para ser modelados los datos.

La forma de hacerlo es utilizar el método de datos del objeto QModelIndex se obtiene en el método de pintura, y pedir una función específica (si se define un modelo personalizado, puede añadir sus propias funciones, y transmita esta información que necesita para el delegado en esos papeles.)

TIMW, yo creo que hay que llenar la información QStyleOptionViewItemV4 llamando initStyleOption antes.

No estoy seguro de que el requisito de una imagen de fondo viene. Si quieres que las células se ven como QPushButtons, probablemente debería heredar de QItemDelegate e implementar paint() utilizar QStyle a dibujar un QPushButton, algo como esto:

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

¿Has probado el uso de hojas de estilo personalizadas?

Se podía aplicar el mismo estilo para todas las células, y luego cambiar la imagen de fondo / estilo para dibujar las imágenes de los botones 3D en función de si o no está seleccionado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top