首页 > 解决方案 > 主窗口在 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

标签: c++qtcrashtablemodelqsortfilterproxymodel

解决方案


推荐阅读