我目前正在尝试通过将QTableView
,QAbstractTableModel
和QStyledItemDelegate
子类化为主要的MVC结构来构建一个Qt表。
我正在使用这个简单的示例作为构建的基础,因为我之前没有接近Qt表类:
http://qt-project.org/doc/qt-4.8/modelview.html
无论如何,该表主要是文本列,但它还需要一个切换按钮列和一个复选框列。
我注意到模型的数据方法可以用来实现一个复选框,但是我需要一个自定义的按钮委托,所以我也打算用它来复选框。
无论如何,我无法在互联网上找到任何通过使用QTableView
对象混合文本,复选框和按钮来创建表格的体面示例。你们中任何一位好先生能指出我正确的方向吗?
答案 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);
}
}