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

时间:2011-12-04 18:59:10

标签: c++ qt

这是从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添加的数据。为什么呢?

2 个答案:

答案 0 :(得分:5)

QAbstractItemModel :: setHeaderData用于处理标头的用户编辑,而不是以编程方式设置它们。然后,模型必须实现setHeaderData来处理这些编辑请求。 QStandardItemModel显然不会创建标题项,如果它们最初没有设置,所以没有任何反应。

当您使用QStandardItemModel时,您应该使用setHorizontalHeaderItemsetHorizontalHeaderLabels(垂直变体也可用)来设置标头。

答案 1 :(得分:-1)

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

相关问题