首先需要了解ItemDataRole,对不同的role设置不同的属性值得到自己想要的效果:
在model中Qt::TextAlignmentRole默认设置为了居中对齐 (Qt::AlignHCenter | Qt::AlignVCenter)
效果图:
具体如何创建委托,如何重写QAbstractTableModel,如何实现翻页或者搜索功能等一切都在源码中
将源码放在项目的文件夹中,在pro问价添加如下代码:
include($$PWD/MyTableView/MyTableView.pri)
demo测试代码:
table_infor_t table_infor;
table_infor.horizontalHeader=QStringList{"复选框","下拉框","数字编辑框","不同数字显示颜色","QSpinBox","进度条","图标","按钮"};
for(int row =0;row<10;++row)
{
for(int col =0;col<table_infor.horizontalHeader.size();++col)
{
table_infor.map_contents[row][col] = 1;
}
}
MyTableView *m_table_view = new MyTableView(table_infor);
QHBoxLayout *h_layout = new QHBoxLayout();
h_layout->addWidget(m_table_view);
this->setLayout(h_layout);
//第一列代理设置为 delegate_checkBox
delegate_checkBox *checkBox_ =new delegate_checkBox();
checkBox_->set_unchecked_name("未选中");
checkBox_->set_checked_name("选中");
m_table_view->tableView->setItemDelegateForColumn(0,checkBox_);
//第二列代理设置为 delegate_comBox
QStringList list_str{"下拉1","下拉2","下拉3","下拉4","下拉5"};
delegate_comBox *comBox_ =new delegate_comBox(nullptr,list_str);
m_table_view->tableView->setItemDelegateForColumn(1,comBox_);
//第三列代理设置为 delegate_edite
delegate_edite *edite_ = new delegate_edite();
m_table_view->tableView->setItemDelegateForColumn(2,edite_);
//第四列代理设置为 delegate_item
delegate_item *item_ = new delegate_item();
item_->pair_equal.first = 1;
item_->pair_equal.second = QColor(Qt::red);
item_->pair_moreThan.first = 1;
item_->pair_moreThan.second = QColor(Qt::green);
item_->pair_lessThan.first = 1;
item_->pair_lessThan.second = QColor(Qt::blue);
m_table_view->tableView->setItemDelegateForColumn(3,item_);
m_table_view->set_delegate_index_text(0,3,1);
m_table_view->set_delegate_index_text(1,3,2);
m_table_view->set_delegate_index_text(2,3,0);
//第五列代理设置为 delegate_spinBox
delegate_spinBox *spinBox_ = new delegate_spinBox();
m_table_view->tableView->setItemDelegateForColumn(4,spinBox_);
//第六列代理设置为 delegate_button
ProgressBarDelegate *progress_ =new ProgressBarDelegate();
m_table_view->tableView->setItemDelegateForColumn(5,progress_);
//第八列代理设置为 delegate_button
delegate_button *button_ =new delegate_button(QStringList{"读取","设置"});
connect(button_,&delegate_button::signal_clicked,this,[=](int button_index,const QModelIndex &index)
{
qDebug()<<"button_index:"<<button_index<<"index:"<<index;
});
m_table_view->tableView->setItemDelegateForColumn(7,button_);
for(int i=0;i<table_infor.row;++i)
{
m_table_view->set_delegate_index_text(i,2,(i+1)*5);
//设置背景色
m_table_view->set_index_text(i,2,QColor(Qt::cyan),Qt::BackgroundRole);
//设置前景色
m_table_view->set_index_text(i,4,QColor(Qt::darkYellow),Qt::ForegroundRole);
m_table_view->set_delegate_index_text(i,5,(i+1)*5);
//设置图标
QIcon icon = QApplication::style()->standardIcon(QStyle::SP_ArrowRight);
m_table_view->set_index_text(i,6,icon,Qt::DecorationRole);
}