c++ - 主窗口在 Qt 中关闭时崩溃 - ProxyModel 标头返回语句
问题描述
关闭时主窗口崩溃的问题,但前提是我打开窗口正常大小(不填满屏幕)然后最大化它并关闭窗口。如果我打开它正常大小并关闭它,没问题。这个项目包括一个 tableview、tableModel 和一个 ProxyModel。在调试时,代理模型头函数中的这条语句似乎崩溃了:
return sourceModel()->headerData(section,orientation,role);
根据我的研究,我假设我在主要构造函数中遗漏了一些东西,但我没有看到它。
Main Window:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QString>
#include "XMLFile.h"
#include "XMLReader.h"
#include "XMLWriter.h"
#include <QFile>
#include <QMainWindow>
#include <QTableWidget>
#include <QStringList>
#include <QHeaderView>
#include <QAction>
#include <QStandardItemModel>
#include <QTableView>
#include <QSortFilterProxyModel>
#include "TableModel.h"
#include "ProxyModel.h"
#include <QItemSelectionModel>
#include "CustomTableView.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
QWidget *centralWidget;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
const QString filename;
public slots:
void ReceiveMessage( const QString &message );
signals:
void readXmlFile( const QString &fileName );
void getXmlTableData();
void setFilter( QString );
private slots:
void on_actionOpen_triggered();
void on_actionFind_triggered();
void on_pushButton_clicked();
void on_tableView_activated(const QModelIndex &index);
void on_actionExport_XML_triggered();
void on_actionExit_triggered();
private:
Ui::MainWindow *ui;
QString xmlFileName;
QFile file;
XMLReader xmlReader;
XMLWriter xmlWriter;
QVector<QString> xmlArray;
QString filter = "";
CustomTableView *tableView;
TableModel mTableModel;
ProxyModel* proxyModel;
QString accountValue;
QString deptValue;
QString yearValue;
QString filterText;
void createItems();
void createConnections();
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>
#include <QMessageBox>
#include <QFile>
#include <QFileDialog>
#include <QApplication>
#include "XMLReader.h"
#include "XMLWriter.h"
#include "XMLFile.h"
#include <QInputDialog>
#include <QMenu>
#include <QModelIndexList>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, xmlReader( filename )
, xmlWriter( filename, &mTableModel )
//, tableView( NULL )
//, proxyModel( NULL )
//, m_xmlView(NULL)
{
ui->setupUi(this);
connect(&xmlReader, SIGNAL(SendMessage(const QString)), this, SLOT(ReceiveMessage(const QString)));
/* Setup tableview */
tableView = new CustomTableView(this);
ui->verticalLayout->addWidget(tableView);
tableView->setSortingEnabled(true);
/* Table Model Setup */
proxyModel = new ProxyModel(this);
proxyModel->setSourceModel(&mTableModel);
createConnections();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::ReceiveMessage(const QString &message)
{
QMessageBox::warning(this, "Warning", "Cannot open file : " + message);
}
void MainWindow::on_actionOpen_triggered()
{
QString filename = QFileDialog::getOpenFileName((this),"Open file");
xmlReader.readFile(filename);
setWindowTitle(filename);
createItems();
}
void MainWindow::createItems()
{
xmlArray = xmlReader.getXmlData();
int tableSize = xmlArray.size();
QStringList strList;
QString strSplit = "";
QVector<TableItem> rows;
/* Split into individual items, add as row to tableItem array.*/
/* Insert each tableItem array into the table model. */
for( int row = 0; row < tableSize; row++ )
{
TableItem newRow;
strSplit = xmlArray[row];
strList = strSplit.split("|");
for( int k = 0; k < strList.length(); k++)
{
newRow.setData(k, strList[k] );
}
rows << newRow;
}
mTableModel.initModel( rows );
QAbstractItemModel* model = nullptr;
model = proxyModel;
tableView->setModel( model );
tableView->setColumnHidden(0, true);
}
void MainWindow::createConnections()
{
QObject::connect(ui->lineEdit, SIGNAL(textChanged(QString)), proxyModel, SLOT(setAccount(QString)));
QObject::connect(ui->lineEdit_2, SIGNAL(textChanged(QString)), proxyModel, SLOT(setDept(QString)));
QObject::connect(ui->lineEdit_3, SIGNAL(textChanged(QString)), proxyModel, SLOT(setYear(QString)));
QObject::connect(this, SIGNAL(setFilter(QString)), proxyModel, SLOT(setSearchFilter(QString)));
}
void MainWindow::on_actionFind_triggered()
{
/* Open find string dialog */
bool ok;
QString filterText = QInputDialog::getText(this, tr("Find"),
tr("Search for string:"), QLineEdit::Normal,"", &ok);
setFilter( filterText );
}
void MainWindow::on_pushButton_clicked()
{
/* Clear filter values */
ui->lineEdit->setText("");
ui->lineEdit_2->setText("");
ui->lineEdit_3->setText("");
setFilter("");
}
void MainWindow::on_tableView_activated(const QModelIndex &index)
{
}
void MainWindow::on_actionExport_XML_triggered()
{
/* Open save file dialog, call xmlWriter */
QString filename = QFileDialog::getSaveFileName(this, tr("Save XML File"), ".", tr("XML files (*.xml)"));
xmlWriter.WriteFile(filename);
}
void MainWindow::on_actionExit_triggered()
{
QApplication::quit();
}
工作代码:MainWindow.cpp
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, xmlReader( filename )
{
ui->setupUi(this);
connect(&xmlReader, SIGNAL(SendMessage(const QString)), this, SLOT(ReceiveMessage(const QString)));
/* Setup tableview */
tableView = new CustomTableView(this);
ui->verticalLayout->addWidget(tableView);
tableView->setSortingEnabled(true);
/* Table Model Setup */
proxyModel = new ProxyModel(this);
proxyModel->setSourceModel(&mTableModel);
createConnections();
}
MainWindow::~MainWindow()
{
delete proxyModel; /* Newly added */
delete tableView; /* Newly added */
delete ui;
}
如果需要,我可以上传更多源代码。感谢您在这里的任何见解。
-d
解决方案
推荐阅读
- tensorflow - 如何在TensorFlow中给定稀疏矩阵数据计算余弦相似度?
- tensorflow - 使用 TensorBoard 从 tf_agents 可视化图形
- json - JSON-RPC 与 JSON 补丁
- python - 在 pyspark RDD 上执行 map/reduce 时出现一些错误
- hybris - 斯巴达克斯目录同步
- featuretools - 使用 featuretools dfs 计算时间窗轮廓
- excel - VBA将特殊字符放入字符串
- java - 调用 Jersey REST 客户端时出现 NoClassDefFoundError
- c - sprintf 的格式说明符不起作用
- scala - 如何在运行时将 hocon 配置动态加载到案例类中