Qt QTableView实现切换按钮和复选框委托

时间:2014-04-04 14:12:17

标签: c++ qt model-view-controller

我目前正在尝试通过将QTableViewQAbstractTableModelQStyledItemDelegate子类化为主要的MVC结构来构建一个Qt表。

我正在使用这个简单的示例作为构建的基础,因为我之前没有接近Qt表类:

http://qt-project.org/doc/qt-4.8/modelview.html

无论如何,该表主要是文本列,但它还需要一个切换按钮列和一个复选框列。

我注意到模型的数据方法可以用来实现一个复选框,但是我需要一个自定义的按钮委托,所以我也打算用它来复选框。

无论如何,我无法在互联网上找到任何通过使用QTableView对象混合文本,复选框和按钮来创建表格的体面示例。你们中任何一位好先生能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

您不需要自定义委托,以便在tableview中使用复选框和切换按钮。您只需将项目设为可检查项并将其设置为您的模型,如:

QStandardItem *item = new QStandardItem( true );
item->setCheckable(true);
item->setCheckState(Qt::Unchecked);

QStandardItemModel * model = new QStandardItemModel( 0, 2 );
model->setRowCount(1);
model->setItem(0, 0, item);

对于切换按钮,您可以这样做:

QPushButton * but = new QPushButton(this);
but->setCheckable(true);
but->setText("Toggle");

ui->tableView->setIndexWidget(model->item(0,1)->index(),but);

答案 1 :(得分:1)

根据上面提供的Dmitry信息,我在我的委托中实现了以下绘制方法,用于渲染我的按钮和复选框。显然,这需要一个editorEvent()做任何我可以添加它的东西,如果它证明是有用的。

void DDUTableDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,
                            const QModelIndex& index) const
{
int col = index.column();

if (col == VIEW_COLUMN) {
    // Draw our checkbox indicator
    bool value = index.data(Qt::EditRole).toBool();
    QStyleOptionButton checkbox_indicator;

    // Set our button state to enabled
    checkbox_indicator.state |= QStyle::State_Enabled;
    checkbox_indicator.state |= (value) ? QStyle::State_On : QStyle::State_Off;

    // Get our deimensions
    checkbox_indicator.rect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkbox_indicator, NULL );

    // Position our indicator
    const int x = option.rect.center().x() - checkbox_indicator.rect.width() / 2;
    const int y = option.rect.center().y() - checkbox_indicator.rect.height() / 2;

    checkbox_indicator.rect.moveTo( x, y );

    if (option.state & QStyle::State_Selected) {
        painter->fillRect(option.rect, option.palette.highlight());       
    }

    QApplication::style()->drawControl( QStyle::CE_CheckBox, &checkbox_indicator, painter );
}
else if (col == TEST_COLUMN) {
     bool value = index.data(Qt::EditRole).toBool();

     QStyleOptionButton button;

     // Set our button to fill the entire cell contents
     button.rect = option.rect;

     // Set our button state to enabled
     button.state |= QStyle::State_Enabled;

     if (value) {
         button.state |= QStyle::State_Sunken;
         button.text = STOP_TEST;
     }
     else {
          button.text = START_TEST;
     }

     if (option.state & QStyle::State_Selected) {
        painter->fillRect(option.rect, option.palette.highlight());         
     }

     QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter);

}   
}