为什么我的视图不显示标题?

Why doesn't my view display headers?

本文关键字:标题 显示 我的 视图 为什么      更新时间:2023-10-16

这是一个从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;
};  

这是一个定义函数:

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添加的头和数据都不显示。为什么?

QAbstractItemModel::setHeaderData是用来处理用户对header的编辑,而不是通过编程方式进行设置。然后模型必须实现setHeaderData来处理那些编辑请求。QStandardItemModel显然不会创建头项,如果他们最初没有设置,所以什么也不会发生。

当您使用QStandardItemModel时,您应该使用setHorizontalHeaderItem或setHorizontalHeaderLabels(垂直变体也可用)来设置标题。

如果您查看文档,您会注意到setHeaderData有四个参数,最后一个是角色。角色默认为Qt::EditRole,但您可能需要Qt::DisplayRole。