Qt Qtableview 的一些用法
SLOT(Function(const QModelIndex &)));//點擊tableview中的item觸發信號
QStandardItemModel model;
//設置大小
model.setColumnCount(3); //列
model.setRowCount(musicFound); //行
//設置標題
model.setHeaderData(0,Qt::Horizontal,"ID");
//添加數據
for(int j=0;j<row;j++)
{
//寫id
QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
model.setItem(j,0,itemID);
}
//選擇這個model
m_ui->tableView->setModel(&model);
//隱藏左邊那列
m_ui->tableView->verticalHeader()->hide();
//列寬
m_ui->tableView->setColumnWidth(0,30);
//整行選擇
m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
三 動態添加行
在表格中添加行時,我們只需要在model中插入數據即可,一旦model中的數據發生變化,QTabelView顯示就會做相應的變動
//在第一行添加學生張三的個人信息(setItem函數的第一個參數表示行號,第二個表示列號,第三個為要顯示的數據)
student_model->setItem(0, 0, new QStandardItem(“張三"));
student_model->setItem(0, 1, new QStandardItem("20120202"));
student_model->setItem(0, 2, new QStandardItem("男"));
student_model->setItem(0, 3, new QStandardItem("18"));
student_model->setItem(0, 4, new QStandardItem("土木學院"));
四 設置列名
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));//編碼設置為GB18030
setValueModel->setHorizontalHeaderLabels(QStringList() <<tr("名稱")<<tr("單位")<<tr("取值范圍")<<tr("定值"));
setValueTableView->setModel(setValueModel);//!!!
setValueTableView->horizontalHeader()->setStretchLastSection(true);//最后一列對窗口動態變化
五、設置數據顯示的樣式
//設置單元格文本居中,張三的數據設置為居中顯示
student_model->item(0, 0)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 1)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 2)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 3)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 4)->setTextAlignment(Qt::AlignCenter);
//設置單元格文本顏色,張三的數據設置為紅色
student_model->item(0, 0)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 1)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 2)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 3)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 4)->setForeground(QBrush(QColor(255, 0, 0)));
//將字體加粗
student_model->item(0, 0)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 1)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 2)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 3)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 4)->setFont( QFont( "Times", 10, QFont::Black ) );
//設置排序方式,按年齡降序顯示
student_model->sort(3, Qt::DescendingOrder);
六 、參考2
QTableView是Qt中用來把數據集以表格形式提供給用戶的一個控件,它與C++Builder中的DBGrid作用類似。坦白的說,DBGrid的使用要比QTableView更容易一些。但QTableView在使用麻煩的同時,也提供了更多的靈活性。
軟件環境: ubuntu
最終效果圖:
一、添加表頭:
- QStandardItemModel *model = new QStandardItemModel();
- model->setColumnCount(2);
- model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("卡號"));
- model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("姓名"));
復制代碼
二、設置表格屬性:
- ui->tableView->setModel(model);
- //表頭信息顯示居左
- ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
- //設置列寬不可變
- ui->tableView->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);
- ui->tableView->horizontalHeader()->setResizeMode(1,QHeaderView::Fixed);
- ui->tableView->setColumnWidth(0,101);
- ui->tableView->setColumnWidth(1,102);
復制代碼
注:在進行表格設置時必須是“ui->tableView->setModel(model);”在前,屬性具體設置在后,
反之則設置不會生效。如上述代碼所示。
三、添加行(添加三行一樣的信息):
- for(int i = 0; i < 3; i++)
- {
- model->setItem(i,0,new QStandardItem("2009441676"));
- //設置字符顏色
- model->item(i,0)->setForeground(QBrush(QColor(255, 0, 0)));
- //設置字符位置
- model->item(i,0)->setTextAlignment(Qt::AlignCenter);
- model->setItem(i,1,new QStandardItem(QString::fromLocal8Bit("哈哈")));
- }
復制代碼
四、刪除行:
- //x是指定刪除哪一行
- model->removeRow(x);
- //刪除所有行
- model->removeRows(0,model->rowCount());
復制代碼
再舉一個例子:
在一個葯品划價模塊中有這樣的操作流程:
檢索處方項目成功后,把該項目顯示到QTableView里,把需要編輯的數量字段提供給用戶輸入,用戶輸入確認后,該項目留在列表中,然后開始下一項目檢索錄入。
實現過程如下:
錄入的項目保留在臨時表tmp中,界面上的QTableView取名為tbList,與tbList關聯的Model取名為tb1。檢索成功后,把檢索結果插入到臨時表中,把需要編輯的字段提供給用戶。
- tb1=newQSqlTableModel(this,*dbR); //dbR是本應用中的數據源
- tb1->setTable("tmp"); //處方臨時表
復制代碼
程序中需要顯示的時候,
- tbList->setModel(NULL); //清除原先數據集
- tbList->setModel(tb1); //刷新顯示
復制代碼
程序中需要提供編輯輸入的時候
- QModelIndexmdidx=m_ui->tbList->model()->index(row,column); //獲得需要編輯的單元格的位置
- m_ui->tbList->setFocus(); //把輸入焦點交給tbList
- m_ui->tbList->setCurrentIndex(mdidx); //設定需要編輯的單元格
- m_ui->tbList->edit(mdidx); //開始編輯
復制代碼
有一個問題需要注意。向QTableView中添加記錄時,字段一定要完整,不能有空白字段,否則結果無法保存。切記。
如果需要對用戶輸入做限制,比如只能在指定的字段輸入指定的數據類型,可以通過QItemDelegate來實現。
貼一段代碼,說明QTableView基本用法
- QStandardItemModel model;
- //設置大小
- model.setColumnCount(3); //列
- model.setRowCount(musicFound); //行
- //設置標題
- model.setHeaderData(0,Qt::Horizontal,"ID");
- //添加數據
- for(int j=0;j<row;j++)
- {
- //寫id
- QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
- model.setItem(j,0,itemID);
- }
- //選擇這個model
- m_ui->tableView->setModel(&model);
- //隱藏左邊那列
- m_ui->tableView->verticalHeader()->hide();
- //列寬
- m_ui->tableView->setColumnWidth(0,30);
- //整行選擇
- m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
QStandardItemModel model;
//設置大小
model.setColumnCount(3); //列
model.setRowCount(musicFound); //行
//設置標題
model.setHeaderData(0,Qt::Horizontal,"ID");
//添加數據
for(int j=0;j<row;j++)
{
//寫id
QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
model.setItem(j,0,itemID);
}
//選擇這個model
m_ui->tableView->setModel(&model);
//隱藏左邊那列
m_ui->tableView->verticalHeader()->hide();
//列寬
m_ui->tableView->setColumnWidth(0,30);
//整行選擇
m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
table_view->setMouseTracking(true);
void TableView::showToolTip(const QModelIndex &index)
{
if(!index.isValid())
return;
int row = index.row();
QString file_name = list_file.at(row);
if(file_name.isEmpty())
return;
QToolTip::showText(QCursor::pos(), file_name);
}
connect(this, &TableView::entered, this, &TableView::showToolTip);
table_view->setSelectionBehavior(QAbstractItemView::SelectRows);
void StyledDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem view_option(option);
if (view_option.state & QStyle::State_HasFocus) {
view_option.state = view_option.state ^ QStyle::State_HasFocus;
}
QStyledItemDelegate::paint(painter, view_option, index);
}
table_view->setItemDelegate(styled_delegate);
QTableView{
border:none;
background:white;
}
QTableView::item:selected{
color:white;
background:rgb(34, 175, 75);
}
void StyledDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem view_option(option);
if (view_option.state & QStyle::State_HasFocus) {
view_option.state = view_option.state ^ QStyle::State_HasFocus;
}
//添加鼠標滑過的背景色
if(option.state & QStyle::State_MouseOver){
painter->fillRect(view_option.rect, QColor(180, 200, 220));
}
QStyledItemDelegate::paint(painter, view_option, index);
}
void TableView::mouseMoveEvent ( QMouseEvent * event)
{ int row = indexAt(event->pos()).row(); updateRow(row); }
void TableView::leaveEvent ( QEvent * event )
{ table_model->setHoverRow(-1);
int column_count= model()->columnCount(); for (int i = column_count- 1; i >= 0; i--) { update(model()->index(current_row, i)); } current_row = -1; }
void TableView::updateRow(int row)
{ if (row == current_row) return; table_model->setHoverRow(row);
int column_count= model()->columnCount(); for (int i = column_count- 1; i >= 0; i--) { update(model()->index(current_row, i)); update(model()->index(row, i)); } table_model->showToolTip(row); //自定義方法用來進行QToolTip的顯示 current_row = row; }
void TableModel::setHoverRow(int hover_row)
{
this->hover_row = hover_row;
}
QVariant ConvertPdfModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
int row = index.row(); //行號
if (row < 0 || row >= list_file.size())
return QVariant();
int column = index.column();
QString name = list_file.at(row);
switch (role) {
case Qt::BackgroundColorRole:{
if (row == hover_row) {
return QColor(180, 200, 220);
}
}
case Qt::DecorationRole: { //圖標
//...
}
case Qt::DisplayRole: { //文本
//...
}
case Qt::TextAlignmentRole: { //對齊方式
//...
}
default:
return QVariant();
}
return QVariant();
}