在本例子中,从文本文件中读取行列的内容并利用QTableView表示在画面上。
文件结构同csv文件相似,第一行为标题,各个列之间有逗号(,)分割。下面这个类实现读取文件并为模型类提供必要的接口。
点击(此处)折叠或打开
-
class QMemberFile : public QFile
-
{
-
public:
-
QMemberFile(const QString& fileName) : QFile(fileName) { m_bOpened = false; }
-
~QMemberFile() { if (m_bOpened) close(); }
-
bool readFile();
-
-
int rowCount() { return m_nRowCount - 1; }
-
int colCount() { return m_nColCount; }
-
QString content(int row, int col) { return m_Contents[row].at(col); }
-
-
private:
-
bool m_bOpened;
-
int m_nRowCount;
-
int m_nColCount;
-
QVector<QStringList> m_Contents;
-
};
-
-
bool QMemberFile::readFile()
-
{
-
m_nRowCount = 0;
-
m_nColCount = 0;
-
-
if (!this->open(QIODevice::ReadOnly | QIODevice::Text))
-
{
-
m_bOpened = false;
-
return false;
-
}
-
m_bOpened = true;
-
-
while (!this->atEnd())
-
{
-
QByteArray line = this->readLine();
-
QString sLine = line;
-
sLine = sLine.trimmed();
-
if (sLine.size() == 0)
-
{
-
continue;
-
}
-
m_Contents.push_back(sLine.split(","));
-
m_nRowCount++;
-
}
-
if (m_nRowCount > 0)
-
{
-
m_nColCount = m_Contents[0].count();
-
}
-
-
return true;
- }
实现一个模型类,这个类需要继承QAbstractTableModel, 需要实现下面几个函数。
int rowCount(const QModelIndex& parent) const;
int columnCount(const QModelIndex& parent) const;
QVariant data(const QModelIndex& index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
如果要实现一个可编辑的视图,还需要实现下面的两个函数。
bool setData(const QModelIndex& index, const QVariant& value, int role);
Qt::ItemFlags flags(const QModelIndex& index);
本例子中我们实现一个只读的视图。下面是模型类的声明和实现
点击(此处)折叠或打开
-
class CMemberTableModel : public QAbstractTableModel
-
{
-
public:
-
CMemberTableModel(QObject* parent = 0) : QAbstractTableModel(parent) { m_pMemFile = NULL; }
-
-
void setFileName(const QString& sFileName);
-
int rowCount(const QModelIndex& parent) const;
-
int columnCount(const QModelIndex& parent) const;
-
QVariant data(const QModelIndex& index, int role) const;
-
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
-
-
private:
-
QMemberFile* m_pMemFile;
-
};
-
-
void CMemberTableModel::setFileName(const QString& sFileName)
-
{
-
reset();
-
delete m_pMemFile;
-
m_pMemFile = new QMemberFile(sFileName);
-
m_pMemFile->readFile();
-
}
-
-
int CMemberTableModel::rowCount(const QModelIndex& parent) const
-
{
-
return m_pMemFile->rowCount();
-
}
-
-
int CMemberTableModel::columnCount(const QModelIndex& parent) const
-
{
-
return m_pMemFile->colCount();
-
}
-
-
QVariant CMemberTableModel::data(const QModelIndex& index, int role) const
-
{
-
if (!index.isValid() || m_pMemFile == NULL)
-
{
-
return QVariant();
-
}
-
-
if (role == Qt::DisplayRole)
-
{
-
return m_pMemFile->content(index.row()+1, index.column());
-
}
-
-
return QVariant();
-
}
-
-
QVariant CMemberTableModel::headerData(int section, Qt::Orientation orientation, int role) const
-
{
-
if (role != Qt::DisplayRole)
-
{
-
return QVariant();
-
}
-
-
if (orientation == Qt::Horizontal)
-
{
-
return m_pMemFile->content(0, section);
-
}
-
else
-
{
-
return QString::number(section+1);
-
}
-
-
return QVariant();
- }
这个程序的主画面是一个继承自QDialog的对话框,对话框里包含两个空间,上面是一个组合框(QComboBox),下面是一个表视图(QTableView).
组合框里可以选择文件名,在QTableView中表示选中文件的内容。
点击(此处)折叠或打开
-
class table_modelview : public QDialog
-
{
-
Q_OBJECT
-
-
public:
-
table_modelview(QWidget *parent = 0, Qt::WFlags flags = 0);
-
~table_modelview();
-
-
void dispFile(const QString& fileName);
-
void addFile(const QString& fileName);
-
-
private slots:
-
void onFileChanged(const QString& sFileName);
-
-
private:
-
Ui::table_modelviewClass ui;
-
-
CMemberTableModel* m_pMemModel;
-
};
-
-
table_modelview::table_modelview(QWidget *parent, Qt::WFlags flags)
-
: QDialog(parent, flags)
-
{
-
ui.setupUi(this);
-
-
setLayout(ui.mainVLayout);
-
m_pMemModel = new CMemberTableModel(this);
-
}
-
-
table_modelview::~table_modelview()
-
{
-
delete m_pMemModel;
-
}
-
-
void table_modelview::dispFile(const QString& fileName)
-
{
-
m_pMemModel->setFileName(fileName);
-
//ui.tvContents->setModel(NULL);
-
ui.tvContents->setModel(m_pMemModel);
-
}
-
-
void table_modelview::onFileChanged(const QString& sFileName)
-
{
-
dispFile(sFileName);
-
}
-
-
void table_modelview::addFile(const QString& fileName)
-
{
-
ui.cbFileList->addItem(fileName);
- }
在main函数中初始化组合框。
点击(此处)折叠或打开
-
int main(int argc, char *argv[])
-
{
-
QApplication a(argc, argv);
-
table_modelview w;
-
w.addFile("D:/test_modelview.txt");
-
w.addFile("D:/test_modelview1.txt");
-
w.show();
-
return a.exec();
- }
需要注意的地方是函数setFileName中对reset的调用,如果没有调用reset, 切换文件时视图里的数据不会刷新,
还有一种方式是在调用setModel()设置视图的模型之前,先执行setModel(NULL)。