Qt Qtableview 的一些用法

mac2022-06-30  98

Qt Qtableview 的一些用法

标签: Qt Qtableview <转> http://5449763.blog.51cto.com/5439763/1122514 一些Qtableview的用法:   一、Qtableview主要借助于QStandardItemModel类来使用,最后再把QStandardItemModel的对象set进去即可   QTableView *tableview; QStandardItemModel *model = new QStandardItemModel(); Qtableview用的mvc模式  实际上用到的是model/view居多 tableview->setmodel(model);来使用model model->setHeaderdata();设置表的column名称; 当然如果想隐藏column名称的话 只需要用:tableview->horizontalHeader()->setVisible(false);  隐藏row名称:tableview->verticalHeader()->setVisible(false); 若是想设置表格column的样式 使用:tableview->->horizontalHeader()->setStyleSheet(); 使用setColumnWidth()来设置Header的宽度; QT还提供了对表格表头进行设置的model: tableview->horizontalHeader()->setResizeMode(); tableview->verticalHeader()->setResizeMode();  Qt提供的 setResizeMode()有四种: QHeaderView::Interactive; QHeaderView::Fixed; QHeaderView::Stretch; QHeaderView::ResizeToContents;  对表格表头设置完之后,接下来就是表格之中的item: 要得到当前选中的item,如下操作: QModelIndex Index = tableview->currentIndex();得到当前的Index; QStandardItem *item = listAll->itemFromIndex(index);//根据index 得到item 如果想让点击item 发送信号 则可以使用: connect(tableview, SIGNAL(clicked ( const QModelIndex &)), this,   SLOT(Function(const QModelIndex &)));//点击tableview中的item触发信号   若要对item可以设置背景颜色  使用:setBackground()即可;     二、  

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(); //把输入焦点交给tbListm_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);}//选择这个modelm_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);

 

 

Qt之QTableView

  (2014-02-20 15:29:11) 转载 标签: 

qtableview

 

qtableview整行选中

 

qtableview整行高亮

qtableview和tooltip

 

qtableview滑过整行

分类: Qt     之前有讲解过QTableWidget的使用( QTableWidget详解(样式、右键菜单、表头塌陷、多选等)),已经算是很详细了,这节再讲更常用的视图部件QTableView的高级用法。     Qt中有几种纯粹的视图部件:QListView、QTableView、QColumnView、QTreeView,所有的这些视图都必须提供一个模型(无论是自定义,还是Qt中已提供的)来与之配合。Qt仍然提供了一些便利的窗口部件(“便利”是因为它们提供了自己内置的模型,并能直接使用),如;QListWidget、QTableWidget、和QTreeWidget。还有QComboBox,既是一个便利的窗口部件也是一个视图部件,也就是说,我们既可以直接使用(因为它提供了内置的模型),也能把它当做一个模型的视图部件(这种情况下,可以提供一个合适的模型给它)。     之所以说视图部件常用,是因为在编程的过程当中经常遇到大数据集,使用视图/模型就显得更有效率。当然,对于数据集较小(数百或数千个项)的应用程序,选择便利部件比较合适。     这节不再去过多的讲解模型/视图如何使用( Qt之模型/视图(实时更新数据)一节有特别介绍),更多的是讨论QTableView的深入用法。   一、实现QToolTip 1.设置鼠标跟随 table_view->setMouseTracking(true);  2.实现自定义槽函数 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); } 3.连接信号与槽 connect(this, &TableView::entered, this, &TableView::showToolTip);   效果如下:     二、整行选中(去掉选中时的虚线),并设置选中色 1.设置整行选中 table_view->setSelectionBehavior(QAbstractItemView::SelectRows); 2.实现自定义委托(QStyledItemDelegate) 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); } 3.设置委托 table_view->setItemDelegate(styled_delegate); 4.使用QSS设置选中色 QTableView{ border:none; background:white; } QTableView::item:selected{ color:white; background:rgb(34, 175, 75); }   效果如下:   三、设置鼠标滑过颜色   1.鼠标滑过某item项高亮(自定义代理里面添加滑过样式) 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); }   效果如下:     这种情况下,可以看出,当鼠标滑过某个item项的时候,改项会改变颜色,但选中的时候是整行选中,则看起来很不协调,下面将讲述如何实现鼠标滑过后整行高亮效果。   2.鼠标滑过整行高亮   自定义视图中实现以下几个方法: 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(); }   效果如下:     updateRow主要是进行颜色更新的,鼠标所在行号若与之前的行号保持一致(鼠标一直处于当前行),则直接返回,否则(行号改变),进行更新。mouseMoveEvent、leaveEvent主要处理鼠标移动、离开过程中的逻辑 —— 然后调用updateRow函数进行实时更新。   总结:        以上针对QTableView做了高级、深入的讲解,加上之前章节对模型/视图的详细用法的介绍,大家应该对这些控件有了更深入的了解,并能更好的使用它们。关于如何处理更为细节的问题,根据这些介绍也能悟出一二,所有的东西都不能尽善尽美,留下的小细节就在实战中慢慢摸索,也许只有遇到困难时,你才会发现还有进步的空间。。。     注:     技术在于交流、沟通,转载请注明出处并保持作品的完整性。     作者: ╰☆奋斗ing❤孩子`  原文: http://blog.sina.com.cn/s/blog_a6fb6cc90101i8it.html。

转载于:https://www.cnblogs.com/Dennis-mi/articles/5261863.html

最新回复(0)