这是从Qt教程复制的类:
class Window : public QWidget
{
Q_OBJECT
public:
Window();
void setSourceModel();
private slots:
void filterRegExpChanged();
void filterColumnChanged();
void sortChanged();
void addMail();
private:
QSortFilterProxyModel *proxyModel;
QStandardItemModel *model;
QGroupBox *sourceGroupBox;
QGroupBox *proxyGroupBox;
QTreeView *sourceView;
QTreeView *proxyView;
QCheckBox *filterCaseSensitivityCheckBox;
QCheckBox *sortCaseSensitivityCheckBox;
QLabel *filterPatternLabel;
QLabel *filterSyntaxLabel;
QLabel *filterColumnLabel;
QLineEdit *filterPatternLineEdit;
QComboBox *filterSyntaxComboBox;
QComboBox *filterColumnComboBox;
QPushButton* button;
};
这是一个ctor的定义:
Window::Window()
{
model = new QStandardItemModel(this);
//HEADERS ARE NOT DISPLAYED EVEN THOUGH I'M SETTING THEM HERE
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Subject"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Sender"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Date"));
proxyModel = new QSortFilterProxyModel;
proxyModel->setDynamicSortFilter(true);
sourceView = new QTreeView;
sourceView->setRootIsDecorated(false);
sourceView->setAlternatingRowColors(true);
proxyView = new QTreeView;
proxyView->setRootIsDecorated(false);
proxyView->setAlternatingRowColors(true);
proxyView->setModel(proxyModel);
proxyView->setSortingEnabled(true);
connect(button,SIGNAL(clicked()),this,SLOT(addMail()));//THIS SEEMS NOT TO MAKE ANY DIFFERENCE - NOTHING IS ADDED
};
void Window::addMail()
{
model->insertRow(0);
model->setData(model->index(0, 0), "subject");
model->setData(model->index(0, 1), "sender");
model->setData(model->index(0, 2), "date");
}
void Window::setSourceModel()
{
proxyModel->setSourceModel(model);
sourceView->setModel(model);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Window window;
window.setSourceModel();
window.show();
return app.exec();
}
既不显示标题,也不显示通过addMail添加的数据。为什么呢?
答案 0 :(得分:5)
QAbstractItemModel :: setHeaderData用于处理标头的用户编辑,而不是以编程方式设置它们。然后,模型必须实现setHeaderData来处理这些编辑请求。 QStandardItemModel显然不会创建标题项,如果它们最初没有设置,所以没有任何反应。
当您使用QStandardItemModel时,您应该使用setHorizontalHeaderItem或setHorizontalHeaderLabels(垂直变体也可用)来设置标头。
答案 1 :(得分:-1)
如果查看文档,您会注意到,setHeaderData有四个参数,最后一个是角色。 该角色默认为Qt :: EditRole,但您可能需要Qt :: DisplayRole。