• 6181阅读
  • 4回复

[提问]如何QTableView在最后增加一行汇总?先谢谢各位了 [复制链接]

上一主题 下一主题
离线cjl3230
 

只看楼主 倒序阅读 楼主  发表于: 2015-06-08

请教一下 我用QTableView和QSqlQueryModel  执行select * from person_t  显示了需要的数据  现在想在最下面显示一行 将对应的字段汇总  类似excel中 最下面加一行汇总  这个汇总行怎么加载和显示啊
  1. QSqlDatabase db;
  2.     if(QSqlDatabase::contains("Book"))
  3.         db = QSqlDatabase::database("Book");
  4.     else
  5.         db = QSqlDatabase::addDatabase("QSQLITE", "Book");
  6.     db.setDatabaseName("test.db");
  7.     if (!db.open())
  8.     {
  9.         qDebug() << "数据库打开失败";
  10.         return;
  11.     }
  12.     model = new QSqlQueryModel(this);
  13.     model->setQuery("select * from person_t", db);
  14. //    model->setHeaderData(0, Qt::Horizontal, tr("序号"));
  15.     model->setHeaderData(1, Qt::Horizontal, tr("时间"));
  16.     model->setHeaderData(2, Qt::Horizontal, tr("姓名"));
  17.     model->setHeaderData(3, Qt::Horizontal, tr("数据1"));
  18.     model->setHeaderData(4, Qt::Horizontal, tr("数据2"));
  19.     model->setHeaderData(5, Qt::Horizontal, tr("数据3"));
  20.     view = new QTableView(this);
  21.     view->setModel(model);
  22.     view->resizeColumnsToContents();
  23.     view->hideColumn(0);
  24.     view->resize(800, 600);
  25.     view->show();


这是代码    现在想在最下面增加一行汇总显示所有角色总的数据1 数据2 和 数据3 (时间和姓名列可以留空或者任意文字)。
离线stlcours

只看该作者 1楼 发表于: 2015-06-08
这有何难,自己统计好以后手动加嘛
离线cjl3230

只看该作者 2楼 发表于: 2015-06-08
回 stlcours 的帖子
stlcours:这有何难,自己统计好以后手动加嘛 (2015-06-08 16:21) 

求教 ,  手动添加的函数  数据已经放到变量里面了 就是不会添加到model显示到view上  求解
离线stlcours

只看该作者 3楼 发表于: 2015-06-08
不好意思,我也不是神,以下方法是我自己弄出来的,应该没有问题:

    QReadWriteLock m_lock; // 锁view用的,否则多个任务同时更新会出错的

void ContentWidget::ShowTasks()
{    
    m_lock.lockForWrite(); // 临界区

    // 这里只根据现成的数据进行显示,不对数据内容现场生成和管理。否则就无法做到让别处修改数据,然后让这里显示了。
    // 先清除所有table里的任务,然后根据内存中的数据m_showlist进行添加
    SystemGlobal::m_tableview->clear(); // 清除显示而已
    SystemGlobal::m_tabledata->clear(); // 真正清除view的数据
    // m_showlist.clear(); // view 以前不写这句也可以正确显示,说明真实数据怎么样不重要,只看addRow时的view数据

    // 读入间接数据,每次都更新model数据
    // connect(this, SIGNAL(addSucc(QStringList)), SystemGlobal::m_tableview, SLOT(addRow(QStringList)));
    // 每次现场准备数据效率低,也不便于修改,因此要提前准备好数据,这里直接添加
    for (int i=0; i<m_showlist.count(); i++) {
        QStringList sss = m_showlist.at(i);    
        qDebug() << sss;
        SystemGlobal::m_tableview->addRow(sss); // good 加入行,会自动显示
        //emit addRow(sss);
    }
    m_lock.unlock();
    // 读完数据以后要显示,最好不要发什么信号,直接调用update函数
    //SystemGlobal::m_tableview->model->setModalDatas(list);
    //table_view->setColumnWidth(0,35); // good 还真是放在这里才起作用。得至少有一行内容,才会起作用
}

其中
ContentWidget是主线程UI里的一个界面类,
SystemGlobal::m_tableview就是你的view,我把它设置为一个全局指针了。
SystemGlobal::m_tabledata就是你的真正数据,其类型是    QList< QStringList > grid_data_list;(根据我的需要,但一般都是这种类型吧,因为我使用的TableView),我把它设置为一个全局指针了。

另外,更新界面时,我认为要上锁(我这里会有多线程更新UI的情况),所以要加上m_lock.lockForWrite();

以上是整体显示所有数据在tableview里,另外还有UpdateTask的情况,就是只更新某一行,这里暂时就不贴了,因为虽然运行良好,但我自己都还有一点疑问。
离线stlcours

只看该作者 4楼 发表于: 2015-06-08
发现还是不全,再贴:
void TableView::addRow(QStringList rowList)
{
    grid_data_list.append(rowList); // 简单增加。注意,这是view的数据
    m_model->refrushModel(); // 增加数据了,就要刷新
    this->setColumnWidth(0,35); // view byme good 还真是放在这里才起作用。得至少有一行内容,才会起作用
}

void TableModel::refrushModel()
{
    beginResetModel(); // view 内置函数,这句是最关键的,后面的信号广播都被我屏蔽了,也没事
    endResetModel();
    // 先得到总共有多少行,然后发信号准备更新这些行
    emit updateCount(this->rowCount(QModelIndex())); // 二级入口,在model里发信号广播。
}
快速回复
限100 字节
 
上一个 下一个