2011-03-29 5 views

Respuesta

6

RENUNCIA: esto puede no ser la manera mejor , pero aquí es una manera en la que tiene el control total. Consideramos que es necesario hacer esto con las casillas de verificación de dibujo.

Puede heredar de QStyledItemDelegate (o QAbstractItemDelegate puede trabajar .. no lo he probado) y reimplementar los métodos paint y editorEvent. Utiliza QStyle::drawControl() (después de establecer las opciones de estilo adecuadas) para dibujar el control en paint, y luego prueba manualmente para un golpe de mouse en el editorEvent y hacer algo con él. Si la memoria no me falla, este código se inspiró en gran medida ( tos, copiado, tos, tos ) de mirar el código fuente de Qt para el QStyledItemDelegate.

void CheckBoxDelegate::paint(QPainter *painter, 
          const QStyleOptionViewItem &option, 
          const QModelIndex &index) const { 
    bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); 

    if (option.state & QStyle::State_Selected) { 
    painter->setPen(QPen(Qt::NoPen)); 
    if (option.state & QStyle::State_Active) { 
     painter->setBrush(QBrush(QPalette().highlight())); 
    } 
    else { 
     painter->setBrush(QBrush(QPalette().color(QPalette::Inactive, 
               QPalette::Highlight))); 
    } 
    painter->drawRect(option.rect); 
    } 

QStyleOptionButton check_box_style_option; 
    check_box_style_option.state |= QStyle::State_Enabled; 
    if (checked) { 
    check_box_style_option.state |= QStyle::State_On; 
    } else { 
    check_box_style_option.state |= QStyle::State_Off; 
    } 
    check_box_style_option.rect = CheckBoxRect(option); 

    QApplication::style()->drawControl(QStyle::CE_CheckBox, 
            &check_box_style_option, 
            painter); 
} 

bool CheckBoxDelegate::editorEvent(QEvent *event, 
            QAbstractItemModel *model, 
            const QStyleOptionViewItem &option, 
            const QModelIndex &index) { 
    if ((event->type() == QEvent::MouseButtonRelease) || 
     (event->type() == QEvent::MouseButtonDblClick)) { 
    QMouseEvent *mouse_event = static_cast<QMouseEvent*>(event); 
    if (mouse_event->button() != Qt::LeftButton || 
     !CheckBoxRect(option).contains(mouse_event->pos())) { 
     return true; 
    } 
    if (event->type() == QEvent::MouseButtonDblClick) { 
     return true; 
    } 
    } else if (event->type() == QEvent::KeyPress) { 
    if (static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space && 
     static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select) { 
     return false; 
    } 
    } else { 
    return false; 
    } 

    bool checked = model->data(index, Qt::DisplayRole).toBool(); 
    return model->setData(index, !checked, Qt::EditRole); 
} 
+0

Gracias. Le vamos a dar una oportunidad. – JasonGenX

+1

Una pregunta, ¿cómo puedo detectar un movimiento de mouse "enter" y "leave" sobre el área de una fila determinada? (en caso de que quisiera implementar un resaltado de la fila actual debajo del cursor del mouse) – JasonGenX

+0

Creo que es 'QEvent :: MouseMove', pero no estoy del todo seguro. Probablemente lo más fácil sería colocar una instrucción 'qDebug() << event-> type()' allí, conducir su aplicación, y luego eliminar todo lo que escupe para encontrar los eventos que necesita manejar. –

Cuestiones relacionadas