Im Qt 프로그래밍에서 매우 새로움 XML 파일에서 가져 오는 Qt TableView로 데이터를 표시하고 싶습니다.Qt TableView에 모델 바인딩
사용자 지정 모델을 만들고 TableView에 바인딩하는 방법에 대한 유용한 자습서를 찾을 수 없습니다.
몇 가지 도움을 주거나 좋은 예가 있으면 알려주세요.
감사
Im Qt 프로그래밍에서 매우 새로움 XML 파일에서 가져 오는 Qt TableView로 데이터를 표시하고 싶습니다.Qt TableView에 모델 바인딩
사용자 지정 모델을 만들고 TableView에 바인딩하는 방법에 대한 유용한 자습서를 찾을 수 없습니다.
몇 가지 도움을 주거나 좋은 예가 있으면 알려주세요.
감사
Qt의 모델 뷰 접근법은 매우 다양합니다. 모든 모델은 QAbstractItemModel에서 상속합니다. 이 클래스를 사용하면 매우 복잡한 데이터 레이아웃 (목록, 트리, 테이블 등)을 만들 수 있지만 구현 노력이 상당히 비싸다.
사용할 수있는 클래스는 QStandardItemModel
입니다. 쉽게 테이블 모델을 만들고 QStandardItem
의 인스턴스 인 항목을 추가 할 수 있습니다. 다음 코드를 사용하여 시작할 수 있습니다.
#include <QtGui>
QStandardItemModel* createModel(QObject* parent)
{
const int numRows = 10;
const int numColumns = 10;
QStandardItemModel* model = new QStandardItemModel(numRows, numColumns);
for (int row = 0; row < numRows; ++row)
{
for (int column = 0; column < numColumns; ++column)
{
QString text = QString('A' + row) + QString::number(column + 1);
QStandardItem* item = new QStandardItem(text);
model->setItem(row, column, item);
}
}
return model;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow window;
QTableView* view = new QTableView;
view->setModel(createModel(view));
window.setCentralWidget(view);
window.show();
return app.exec();
}
알다시피, 정말 사용하기 쉽습니다. 그러나 단점은 QStandardItem
을 통해 데이터를 제공해야하므로 메모리 낭비 일 수 있습니다. 예를 들어,보기에 표시하고자하는 100MB의 데이터가 여러 개 있다고 가정합니다. 이미 데이터를 저장 했으므로 모든 셀에 대해 QStandardItem
을 만드는 대신보기에 사용할 수 있도록 적응하는 것이 좋습니다.
여기는 QAbstractTableModel
이 등장합니다. 다음 예제에서는 250,000 개의 항목이있는 행렬을 만듭니다. 대신 각 행렬 요소에 대해 하나의 QStandardItem
, 을 만드는 우리는 QAbstractTableModel
-클래스를 서브하고 행, 열 및 표시 할 데이터의 수를 반환 세 가지 순수 가상 메서드 numRows()
, numColumns()
및 data()
을 구현합니다.
#include <QtGui>
class MatrixModel : public QAbstractTableModel
{
public:
MatrixModel(int numRows, int numColumns, double* data)
: m_numRows(numRows),
m_numColumns(numColumns),
m_data(data)
{
}
int rowCount(const QModelIndex& parent = QModelIndex()) const
{
return m_numRows;
}
int columnCount(const QModelIndex& parent = QModelIndex()) const
{
return m_numColumns;
}
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const
{
if (!index.isValid() || role != Qt::DisplayRole)
return QVariant();
// Return the data to which index points.
return m_data[index.row() * m_numColumns + index.column()];
}
private:
int m_numRows;
int m_numColumns;
double* m_data;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// Create a matrix.
const int numRows = 500;
const int numColumns = 500;
double matrix[numRows][numColumns];
for (int i = 0; i < numRows; ++i)
for (int j = 0; j < numColumns; ++j)
matrix[i][j] = i + j;
// Create a model which adapts the data (the matrix) to the view.
MatrixModel model(numRows, numColumns, (double*)matrix);
QMainWindow window;
QTableView* view = new QTableView;
view->setModel(&model);
window.setCentralWidget(view);
window.show();
return app.exec();
}
여기서 알 수 있듯이 모델은 데이터를 복제하지 않고 어댑터로 사용됩니다. 더 많은 유연성이 필요한 경우 QAbstractItemModel
으로 이동하고 이벤트 구현 을 사용하면 읽을 모델 데이터를 지정하는 데 Qt에서 사용하거나 으로 작성할 수 있습니다.
이것은 아마 당신은 시작한다, http://doc.qt.io/qt-5/modelview.html
당신이 끊임없이 변화하는 XML 소스에서 적극적으로 읽을 수 및 업데이트를 원하기 때문에 사용자 정의 모델을 원하십니까?
그렇지 않은 경우 일반 QTableView 자습서와 QStandardItemModel을 간단히 사용할 수 있습니다. XML 파일을 직접 파싱하고 QStandardItem 개체를 만들어 모델에 추가합니다.
사용자 지정 모델은 외부에서 채우는 항목 기반 방식과 달리 XML 파일의 읽기를 모델 자체에 직접 통합하는 방법입니다.