Проблема с ошибкой заключается в том, что вы используете defaultConnection, вместо этого вы должны создать временное соединение. Также предполагая, что MainWindow является окном, я не вижу logi c, в котором есть метод, который предоставляет только модель, так как вы должны создать окно, которое не будет отображаться для предоставления этих данных, лучше, чтобы этот метод был функцией.
С другой стороны, я считаю ненужным использовать QStandardItemModel и QSortFilterProxyModel для изменения выравнивания текста, так как достаточно иметь настраиваемый QStyledItemDelegate.
Наконец, я вижу, что вы пытаетесь исключить указатель модели, поскольку это нелогично, поскольку в теории вы пытаетесь уничтожить информацию, используемую представлением, кроме того, модель является объектом QObject, поэтому при использовании delete не удаляется модель, вместо этого следует использовать deleteLater, но даже в Qt Вы не должны обращаться с памятью напрямую, лучше оставить это задание родительскому.
Обновление:
В случае QSqlTableModel оно предназначено для сохранения соединение открыто, пока существует модель, поэтому соединение не может быть удалено редактор Поэтому, если вы хотите удалить соединение, вы должны использовать QSqlQueryModel.
connection.h
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QSqlDatabase>
#include <QSqlTableModel>
static QSqlQueryModel * loadTable(){
QSqlQueryModel *model;
{
QSqlDatabase db= QSqlDatabase::addDatabase("QSQLITE", "db_temporal");
db.setDatabaseName("/home/adan/Groostore/MainDB.db");
if(!db.open())
return nullptr;
QSqlQuery query("select * from Main", db);
model = new QSqlQueryModel;
model->setQuery(query);
}
QSqlDatabase::removeDatabase("db_temporal");
return model;
}
#endif // CONNECTION_H
aligncenterdelegate.h
#ifndef ALIGNCENTERDELEGATE_H
#define ALIGNCENTERDELEGATE_H
#include <QStyledItemDelegate>
class AlignCenterDelegate : public QStyledItemDelegate
{
public:
using QStyledItemDelegate::QStyledItemDelegate;
protected:
void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const;
};
#endif // ALIGNCENTERDELEGATE_H
aligncenterdelegate. cpp
#include "aligncenterdelegate.h"
void AlignCenterDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
{
QStyledItemDelegate::initStyleOption(option, index);
option->displayAlignment = Qt::AlignCenter;
}
Теперь просто установите делегат в конструкторе:
// ...
ui->setupUi(this);
ui->tableView->setItemDelegate(new AlignCenterDelegate(this));
// ...
И затем загрузите модель с следующий код:
// ...
if(QSqlQueryModel *model = loadTable()){
if(QAbstractItemModel *previos_model = ui->tableView->model()){
previos_model->deleteLater();
}
model->setParent(this);
ui->tableView->setModel(model);
}
// ...