Qt Qtableview 的一些用法

来源:互联网 发布:黑子的篮球 知乎 编辑:程序博客网 时间:2024/05/17 20:33
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

  最终效果图:

   634868407862099609.jpg



  一、添加表头:

  1. QStandardItemModel *model = new QStandardItemModel();
  2. model->setColumnCount(2);
  3. model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("卡号"));
  4. model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("姓名"));
复制代码


  二、设置表格属性:

  1. ui->tableView->setModel(model);
  2. //表头信息显示居左
  3. ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
  4. //设置列宽不可变
  5. ui->tableView->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);
  6. ui->tableView->horizontalHeader()->setResizeMode(1,QHeaderView::Fixed);
  7. ui->tableView->setColumnWidth(0,101);
  8. ui->tableView->setColumnWidth(1,102);
复制代码


  注:在进行表格设置时必须是“ui->tableView->setModel(model);”在前,属性具体设置在后,

  反之则设置不会生效。如上述代码所示。

  三、添加行(添加三行一样的信息):

  1.  for(int i = 0; i < 3; i++)
  2.  {
  3.      model->setItem(i,0,new QStandardItem("2009441676"));
  4.         //设置字符颜色
  5.      model->item(i,0)->setForeground(QBrush(QColor(255, 0, 0)));
  6.         //设置字符位置
  7.      model->item(i,0)->setTextAlignment(Qt::AlignCenter);
  8.      model->setItem(i,1,new QStandardItem(QString::fromLocal8Bit("哈哈")));
  9.  }
复制代码


  四、删除行:

  1. //x是指定删除哪一行
  2. model->removeRow(x);
  3. //删除所有行
  4. model->removeRows(0,model->rowCount());
复制代码


  再举一个例子:

  在一个药品划价模块中有这样的操作流程:

  检索处方项目成功后,把该项目显示到QTableView里,把需要编辑的数量字段提供给用户输入,用户输入确认后,该项目留在列表中,然后开始下一项目检索录入。

  实现过程如下:

  录入的项目保留在临时表tmp中,界面上的QTableView取名为tbList,与tbList关联的Model取名为tb1。检索成功后,把检索结果插入到临时表中,把需要编辑的字段提供给用户。

  1. tb1=newQSqlTableModel(this,*dbR); //dbR是本应用中的数据源
  2. tb1->setTable("tmp"); //处方临时表
复制代码


  程序中需要显示的时候,

  1. tbList->setModel(NULL); //清除原先数据集
  2. tbList->setModel(tb1); //刷新显示
复制代码


  程序中需要提供编辑输入的时候

  1. QModelIndexmdidx=m_ui->tbList->model()->index(row,column); //获得需要编辑的单元格的位置
  2. m_ui->tbList->setFocus(); //把输入焦点交给tbList
  3. m_ui->tbList->setCurrentIndex(mdidx); //设定需要编辑的单元格
  4. m_ui->tbList->edit(mdidx); //开始编辑
复制代码


  有一个问题需要注意。向QTableView中添加记录时,字段一定要完整,不能有空白字段,否则结果无法保存。切记。

  如果需要对用户输入做限制,比如只能在指定的字段输入指定的数据类型,可以通过QItemDelegate来实现。

  贴一段代码,说明QTableView基本用法

  1. QStandardItemModel model;
  2. //设置大小
  3. model.setColumnCount(3); //列
  4. model.setRowCount(musicFound); //行
  5. //设置标题
  6. model.setHeaderData(0,Qt::Horizontal,"ID");
  7. //添加数据
  8. for(int j=0;j<row;j++)
  9. {
  10.             //写id
  11.             QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
  12.             model.setItem(j,0,itemID);
  13. }
  14. //选择这个model
  15. m_ui->tableView->setModel(&model);
  16. //隐藏左边那列
  17. m_ui->tableView->verticalHeader()->hide();
  18. //列宽
  19. m_ui->tableView->setColumnWidth(0,30);
  20. //整行选择
  21. m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);


 

原创粉丝点击