• 9778阅读
  • 10回复

由数值序列建立表格的方法 [复制链接]

上一主题 下一主题
离线cdanger
 
只看楼主 倒序阅读 楼主  发表于: 2008-05-09
— 本帖被 XChinux 执行加亮操作(2008-05-09) —
关键词: 表格QLineEdit
不好意思,这个问题看起来很简单:
文本文件里有如下数据:
$#    mid        ro
        1 7830.0000
$#      t1        t2        t3        t4        t5        t6        t7        t8
301.00000 472.00000 643.00000 814.00000 985.00000 1156.0000 1327.0000 1498.0000
$#      e1        e2        e3        e4        e5        e6        e7        e8
2.3600E+112.3000E+112.1600E+111.8100E+111.5800E+111.3200E+111.1800E+111.0000E+11
…………
…………
界面上直观的显示出来附图所示,我现在用的是QLabel与QLineEdit(这样可以复制数据),按文件读取的行与列做循环加入。现在有两个问题:
1、速度很慢,虽然只有六七行x七八列的数据,但得两秒以上才显示。
2、选择其它文件更新表格时,怎么处理?delete掉再new不是个好方法吧?Layout的处理也比较麻烦。

麻烦各位兄弟帮忙看一下。
离线XChinux

只看该作者 1楼 发表于: 2008-05-09
使用QTableView + QStandardItemModel吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线cdanger
只看该作者 2楼 发表于: 2008-05-09
但是要求图示这样的样式,TableView做不到吧?
离线diyuanbo

只看该作者 3楼 发表于: 2008-05-09
第一行的ro为什么和t5和e5对齐呢?对齐的规则能描述一下?
离线diyuanbo

只看该作者 4楼 发表于: 2008-05-09
e1  e2 ...下一行的数据连成一片?是一个字符串?
离线giscn
只看该作者 5楼 发表于: 2008-05-10
我不感觉有这么慢,将代码放上我们测试一下
http://nzt.spaces.live.com
离线cdanger
只看该作者 6楼 发表于: 2008-05-14
代码贴出来大家帮忙看一下:
这个是填表格的函数,慢是因为不停对加Layout吧。
  1. void GMainWindow::fillMatlibArg(QListWidgetItem *item)
  2. {
  3.     QString filename = "matlib\\" + item->text() + ".mat";
  4.     QFile currentFile(filename);
  5.     // 打开文件
  6.     if (!currentFile.open(QIODevice::ReadOnly | QIODevice::Text))
  7.     return;
  8.     while (!currentFile.atEnd()) {
  9.     QByteArray line = currentFile.readLine();
  10.     line = line.simplified();
  11.     if (line.startsWith("*MAT_ELASTIC_PLASTIC_THERMAL")) {
  12.         while (!currentFile.atEnd()) {
  13.         line = currentFile.readLine();
  14.         line = line.simplified();
  15.         if (line.startsWith("*"))
  16.             return;
  17.         if (line.at(0) == '$') {  // 以$开头的行,是表头,用QLabel
  18.             QList<QByteArray> data = line.split(' ');
  19.             QHBoxLayout *hlabelBox = new QHBoxLayout();
  20.             hlabelBox->setSpacing(2);
  21.             for (int i = 1; i < data.size(); i++) {
  22.             QLabel* labelt = new QLabel(matGroupBox);
  23.             labelt->setText(QString(data[i].data()));
  24.             hlabelBox->addWidget(labelt);
  25.             }
  26.             tableBox->addLayout(hlabelBox);
  27.         }
  28.         else {  //数据行,用QLineEdit,这样数据可以复制操作(只读)
  29.             QList<QByteArray> data = line.split(' ');
  30.             QHBoxLayout *hvalueBox = new QHBoxLayout();
  31.             hvalueBox->setSpacing(2);
  32.             for (int i = 0; i < data.size(); i++) {
  33.             QLineEdit *lineEdit = new QLineEdit(QString(data[i].data()), matGroupBox);
  34.             lineEdit->setFrame(false);
  35.             lineEdit->setReadOnly(true);
  36.             hvalueBox->addWidget(lineEdit);
  37.             }
  38.             tableBox->addLayout(hvalueBox);
  39.         }
  40.         }
  41.     }
  42.     }
  43. }



第一行的对齐其实是不对了,应该左对齐。
还有e1, e2, ...下面这一行是数据文件有错,少了空格分隔。
离线lzian
只看该作者 7楼 发表于: 2008-05-14
暂且不管算法,你写代码的格式就很不规范,看起来太费劲
离线cdanger
只看该作者 8楼 发表于: 2008-05-14
引用第7楼lzian于2008-05-14 12:42发表的  :
暂且不管算法,你写代码的格式就很不规范,看起来太费劲

格式??
有什么问题吗?也许是论坛里的对齐有问题吧?
离线lzian
只看该作者 9楼 发表于: 2008-05-14
可以用QTableView+QStandardItemModel实现,QTableView::setAlternatingColors(true)可以有颜色间隔显示的效果;
我建议:
    1. 在designer里,用两个QTableView+QStandardItemModel;一个显现头两行,一个显示下面的
    2. designer中,QTableView的palette可以更改Base和BlternateBase的颜色,达到你的效果,再调用QTableView::setAlternatingColors(true)
    3. 之所以用QStandardItemModel,是因为它可以随意设置表的行列数,这样就不用总是new对象了,节省空间;这样新的文件只要更改行列数及数值就可以了。
    4. 先分析数据再填表格,把所有数据都放到QVector中,再把QVector中的数据填到表格里,
离线cdanger
只看该作者 10楼 发表于: 2008-05-14
谢谢,我先看看QTableView能否满足外观需要。
快速回复
限100 字节
 
上一个 下一个