首页 > 解决方案 > QTableWidget 或 sql 中的矩阵

问题描述

我需要创建一个图形邻接矩阵,我首先想创建一个 qtablewidget,但它在关闭后不保存值。这可以做到吗?或者最好创建一个sql数据库,但我无法想出一个像乘法表一样产生矩阵的输出。我的想法是创建记录,以便有 3 列:node1、node2 和 edge。像这样的东西:

"CREATE TABLE userlist ( " "node1 VARCHAR(20)," "node2 VARCHAR(20), " "edge VARCHAR(20));"

标准输出的形成是不合适的。

model = new QSqlTableModel(this, db);
model ->setTable("graphlist");
model ->select();
ui_Main->tableView->setModel(model);

矩阵

标签: c++sqlsqliteqt

解决方案


我完全不明白你的意图。但我假设您已经使用带有列的表在数据库中存储了一个图表node1, node2, edge。现在你想要一个显示邻接矩阵的表格。

我建议QAbstractTableModel通过提供二维数组中的数据来为您的输出表使用 a 。然后使用 . 将 2D 数组与数据库同步QSqlTableModel

类似的东西:

将抽象类继承QAbstractTableModel给一个类MyModel,并向其添加静态二维数组或向量。使用以下内容覆盖该data函数

QVariant data(const QModelIndex & index, int role = Qt::DisplayRole){
    return QVariant(MyModel::array[index.row()][index.column()]);
}

此外,您还必须填充 2D 数组

model = new QSqlTableModel(this, db);
model ->setTable("graphlist"); 
model ->select();
for (int i=0;I<model->rowCount();++i){

MyModel::array[model.record(i).value("node1").toInt()][model.record(i).value("node2").toInt()]=model.record(i).value("edge").toInt();

很抱歉,我的代码可能会引起一些混淆,.->我相信您可以在代码中相应地处理它们。

另外我不知道你为什么varchar在你的桌子上使用。最好使用int。但如果有必要,那么您可以使用另一个字符串数组来存储这些varchar项目并映射它们。


推荐阅读