本文总结了QTableView常用方法,包括常规的数据显示、表头设置、字体和颜色设置、行列的高宽,显示格式设置等,还有一套分页算法,在QTableView表格里插入QLineEdit、QPushButton、QCheckBox等控件,常用的qss设置,直接显示数据库数据等。
目录
- 常用设置
- 常用QSS
- 效果图
- QTableView显示数据库表
常用设置
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);pItemModel = new QStandardItemModel();//初始化测试数据for(int index=0;index<23;index++){Student tStudent;tStudent.name = QString("学生%1").arg(index);tStudent.price = QString::number(10000+index);tStudent.number = QString::number(200+index);mvStudent.append(tStudent);}nTotalConut = 0;//一共多少条nTotalPageNum = 0;//一共多少页nCurrPageNum = 0;//当前第几页nPerPageCnt = 5;//每页多少条connect(ui->pushButton_queding,&QPushButton::clicked,this,&MainWindow::slot_pushButton_queding_tz);connect(ui->pushButton_xiayiye,&QPushButton::clicked,this,&MainWindow::slot_pushButton_xiayiye);connect(ui->pushButton_shangyiye,&QPushButton::clicked,this,&MainWindow::slot_pushButton_shangyiye);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::displayTable(int nStart, int nEnd)
{int columenCnt = nEnd - nStart + 1;pItemModel->clear();ui->tableView->setModel(pItemModel);QVector<Student> tvStudent = mvStudent.mid(nStart,columenCnt);if(tvStudent.size() != columenCnt){qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"分页数据异常";return;}///1.清空表格内容pItemModel->clear();ui->tableView->setModel(pItemModel);///2.设置表头QStringList t_HeaderList_D;t_HeaderList_D<<"序号"<<"姓名"<<"学号"<<"学费\n(元)"<<"爱好"<<"删除"<<"选中";//'\n'表头换行pItemModel->setHorizontalHeaderLabels(t_HeaderList_D);//水平表头///3.设置表头字体和颜色QFont fontHeader("微软雅黑",11);for( int col=0; col<pItemModel->columnCount(); ++col ){QStandardItem *headerItem = pItemModel->horizontalHeaderItem(col);headerItem->setFont(fontHeader);headerItem->setForeground(QBrush(QColor(255, 255, 255)));//设置颜色}///4.行与列数量pItemModel->setRowCount(columenCnt);//设置行数量pItemModel->setColumnCount(7);//设置列数量///5.填充表格内容for(int index=0;index<columenCnt;index++){//新建单元格,初始化内容pItemModel->setItem(index, 0, new QStandardItem(QString::number(index+1)));pItemModel->setItem(index, 1, new QStandardItem(tvStudent.at(index).name));pItemModel->setItem(index, 2, new QStandardItem(tvStudent.at(index).number));pItemModel->setItem(index, 3, new QStandardItem(tvStudent.at(index).price));//单元格内容居中pItemModel->item(index,0)->setTextAlignment(Qt::AlignCenter);pItemModel->item(index,1)->setTextAlignment(Qt::AlignCenter);pItemModel->item(index,2)->setTextAlignment(Qt::AlignCenter);pItemModel->item(index,3)->setTextAlignment(Qt::AlignCenter);//设置单元格字体pItemModel->item(index,0)->setFont(QFont("微软雅黑",10));pItemModel->item(index,1)->setFont(QFont("微软雅黑",10));pItemModel->item(index,2)->setFont(QFont("微软雅黑",10));pItemModel->item(index,3)->setFont(QFont("微软雅黑",10));int subscript = (nCurrPageNum - 1)*nPerPageCnt + index;///结构体容器下标///创建QLineEditQLineEdit *aihao = new QLineEdit(this);ui->tableView->setIndexWidget(pItemModel->index(index, 4), aihao);aihao->setFont(QFont("微软雅黑",18));aihao->setProperty("id",index);aihao->setText(mvStudent.at(subscript).aihao);connect(aihao,&QLineEdit::textChanged,this,&MainWindow::slot_QLineEdit_aihao_textChanged);///创建QPushButtonQPushButton *button = new QPushButton(this);button->setProperty("id", index);button->setText("删除");ui->tableView->setIndexWidget(pItemModel->index(index, 5), button);connect(button,&QPushButton::clicked,this,&MainWindow::slot_QPushButton_TAB_SC);///创建QCheckBoxQCheckBox *CheckBox = new QCheckBox(this);CheckBox->setProperty("id", index);ui->tableView->setIndexWidget(pItemModel->index(index, 6), CheckBox);CheckBox->setStyleSheet("QCheckBox::indicator{ subcontrol-position:center center;width: 39px;height: 39px;}");connect(CheckBox,&QCheckBox::clicked,this,&MainWindow::slot_CheckBox_tabChicked);if(vbChecked.at(subscript) == true)CheckBox->setChecked(true);}// pItemModel->item(1, 0)->setForeground(QBrush(QColor(255, 0, 0)));//设置单元格字体颜色
// pItemModel->sort(0, Qt::DescendingOrder);//第0列降序排序///6.设置单元格宽度ui->tableView->setModel(pItemModel);ui->tableView->setColumnWidth(0,46 );ui->tableView->setColumnWidth(1,180);ui->tableView->setColumnWidth(2,90 );ui->tableView->setColumnWidth(3,90 );ui->tableView->setColumnWidth(4,120 );ui->tableView->setColumnWidth(5,90);ui->tableView->setColumnWidth(6,80 );///7.通用设置
// ui->tableView->verticalHeader()->setVisible(false);//垂直表头不显示
// ui->tableView->horizontalHeader()->setVisible(false);//水平表头不显示
// ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中整行ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑
// ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置自适应调整宽度,填充整个屏幕
// ui->tableView->setShowGrid(false);//不显示网格线
// ui->tableView->setStyleSheet("QTableView::Item{border:0px solid rgb(0,0,0);"
// "border-bottom:1px solid rgb(0,0,0);}");//不显示网格线时,添加下划线ui->tableView->setAlternatingRowColors(true);//设置相邻行颜色交替显示ui->tableView->verticalHeader()->setDefaultSectionSize(39);//设置默认行高ui->tableView->setSelectionMode(QAbstractItemView::NoSelection);//设置表格不可被选中
// QTableWidgetItem *item=ui->tableView->item(0,4);//设置表格中某个单元格不可被选中,QTableWidget有该方法
// item->setFlags(item->flags()&~Qt::ItemIsSelectable);ui->tableView->resizeColumnToContents(2);//根据内容自动调整某列的列宽ui->tableView->resizeColumnsToContents();//根据内容自动调整所有列的列宽ui->tableView->resizeRowToContents(2);//根据内容自动调整某一行的行高ui->tableView->resizeRowsToContents();//根据内容自动调整所有行的行高。
}/*** @brief 计算表格数据,总共多少条,分多少页,当前第几页* @param count 总共多少条记录*/
void MainWindow::cptPageData(int count)
{if(nPerPageCnt == 0)return;nTotalConut = count;nTotalPageNum = nTotalConut/nPerPageCnt + (nTotalConut%nPerPageCnt ? 1 : 0);if(count > 0){nCurrPageNum = 1;}else{nCurrPageNum = 0;}
}/*** @brief 计算表格每页下标范围* @param nStart 起始下标* @param nEnd 截止下标*/
void MainWindow::cptSubscriptRange(int &nStart, int &nEnd)
{if(nPerPageCnt == 0)return;if(nCurrPageNum < nTotalPageNum)//每页nPerPageCnt条{nStart = (nCurrPageNum - 1)*nPerPageCnt;nEnd = nCurrPageNum*nPerPageCnt - 1;}else if(nCurrPageNum == nTotalPageNum)//最后一页,条数<=5{if(nTotalConut%nPerPageCnt == 0)//最后一页刚好是nPerPageCnt条{nStart = (nCurrPageNum - 1)*nPerPageCnt;nEnd = (nCurrPageNum)*nPerPageCnt - 1;}else{nStart = (nCurrPageNum - 1)*nPerPageCnt;nEnd = (nCurrPageNum - 1)*nPerPageCnt + nTotalConut%nPerPageCnt - 1;}}
}/*** @brief 设置提示信息* @param yeshu 总共多少页* @param count 总共多少条* @param currYe 当前第几页*/
void MainWindow::setlabel_tishi(int yeshu, int count, int currYe)
{ui->label_tishi->setText(QString("共计%1页,%2条记录,当前第%3页").arg(QString::number(yeshu)).arg(QString::number(count)).arg(QString::number(currYe)));
}///删除按钮-确认
void MainWindow::slot_QPushButton_TAB_SC()
{QPushButton* p_sender = qobject_cast<QPushButton*>(sender());int id = p_sender->property("id").toInt();int subscript = (nCurrPageNum - 1)*nPerPageCnt + id;//账单列表billList,当前选择下标if(subscript >= mvStudent.size()){return;}mvStudent.remove(subscript);cptPageData(mvStudent.size());int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///爱好输入框内容变化
void MainWindow::slot_QLineEdit_aihao_textChanged(QString text)
{QLineEdit* p_sender = qobject_cast<QLineEdit*>(sender());int id = p_sender->property("id").toInt();int subscript = (nCurrPageNum - 1)*nPerPageCnt + id;mvStudent[subscript].aihao = text;
}///表格中的QCheckBox被点击
void MainWindow::slot_CheckBox_tabChicked()
{QCheckBox* p_sender = qobject_cast<QCheckBox*>(sender());int id = p_sender->property("id").toInt();int subscript = (nCurrPageNum - 1)*nPerPageCnt + id;if(vbChecked.at(subscript) == true){vbChecked[subscript] = false;}else{vbChecked[subscript] = true;}
}///确定
void MainWindow::slot_pushButton_queding_tz()
{int target = ui->lineEdit_yeshu->text().toInt();if(target<=0 || target > nTotalPageNum)return;nCurrPageNum = target;int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///下一页
void MainWindow::slot_pushButton_xiayiye()
{if(nCurrPageNum +1 > nTotalPageNum)return;nCurrPageNum = nCurrPageNum + 1;int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///上一页
void MainWindow::slot_pushButton_shangyiye()
{if(nCurrPageNum -1 <= 0)return;nCurrPageNum = nCurrPageNum - 1;int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///显示
void MainWindow::on_pushButton_display_clicked()
{int hukouNum = mvStudent.size();cptPageData(hukouNum);vbChecked.clear();for(int index=0;index<nTotalConut;index++){bool ische = false;vbChecked.append(ische);}int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}
常用QSS
包括左上角表头按钮样式,水平表头和垂直表头样式设置
QTableView QTableCornerButton::section { border-image: url(./images/yuanxing.png); }
QTableView QTableCornerButton::section:hover { border-image: url(./images/chengse.png); }
QTableView QTableCornerButton::section:pressed { border-image: url(./images/lvse.png); }QHeaderView { border-image: url("./images/tableview/title_normal.png") 1px; border-width: 1px; padding: -1px; }
QHeaderView::section:horizontal { background: transparent; border-width: 2px; padding: -2px; min-height: 49px;}
QHeaderView::section:horizontal { border-image: url("./images/tableview/title_normal.png") 2px; }
QHeaderView::section:horizontal:hover { border-image: url("./images/tableview/title_hover.png") 2px; }
QHeaderView::section:horizontal:pressed { border-image: url("./images/tableview/title_selected.png") 2px; }
QHeaderView::section:vertical { background: transparent; border-width: 2px; padding: -2px; min-width: 30px; width: 30px; }
QHeaderView::section:vertical { border-image: url("./images/tableview/lefttitle_normal.png") 2px; }
QHeaderView::section:vertical:hover { border-image: url("./images/tableview/lefttitle_hover.png") 2px; }
QHeaderView::section:vertical:pressed { border-image: url("./images/tableview/lefttitle_selected.png") 2px; }
效果图
QTableView显示数据库表
上面介绍的数据显示方式是单元格逐一赋值的,如果是显示sqlite、Oracle等数据库中的表格,有更简单的方法,使用QSqlTableModel类。
GlobalVar_QSRM::g_pdjDataBase = QSqlDatabase::addDatabase("QSQLITE");GlobalVar_QSRM::g_pdjDataBase.setDatabaseName(GlobalVar_QSRM::g_DataBaseFile);//初始化数据库
QSqlTableModel *pSqlTableModel;//显示数据库的model
pSqlTableModel = new QSqlTableModel(this,GlobalVar_QSRM::g_pdjDataBase);pSqlTableModel->setTable("RefrashSaleman");//可以传数据库表名,也可以传数据库视图名
ui->tableView->setModel(pSqlTableModel);
pSqlTableModel->select();
//默认最多显示256条,这里可以加载全部数据
while(pSqlTableModel->canFetchMore())
{pSqlTableModel->fetchMore();
}
//设置表头
pSqlTableModel->setHeaderData(0,Qt::Horizontal,"ID");
pSqlTableModel->setHeaderData(1,Qt::Horizontal,"姓名");
pSqlTableModel->setHeaderData(2,Qt::Horizontal,"登陆密码");
pSqlTableModel->setHeaderData(3,Qt::Horizontal,"星级");
pSqlTableModel->setHeaderData(4,Qt::Horizontal,"营业厅代码");
pSqlTableModel->setHeaderData(5,Qt::Horizontal,"所属营业厅");
pSqlTableModel->setHeaderData(6,Qt::Horizontal,"状态");//精确查询
QString cellname = ui->LineEditCellName->text().trimmed();//去掉字符串前后的空白部分
QString str = QString("cellname = '%1'").arg(cellname);
modelDspDB->setFilter(str);
modelDspDB->select();//模糊查询
QString str = " ";
QString cellname = ui->LineEditCellName->text().trimmed();
if(!cellname.isEmpty())
{str = QString("cellname like '%%1%'").arg(cellname);
}elsereturn;modelDspDB->setFilter(str);
modelDspDB->select();