Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ HorizontalHeaderView未调用QAbstractTableModel的headerData();孩子_C++_Qt_Qml_Qt5_Tableview - Fatal编程技术网

C++ HorizontalHeaderView未调用QAbstractTableModel的headerData();孩子

C++ HorizontalHeaderView未调用QAbstractTableModel的headerData();孩子,c++,qt,qml,qt5,tableview,C++,Qt,Qml,Qt5,Tableview,根据,如果模型是QAbstractTableModel,则标头将显示模型的水平headerData();否则,将显示模型的数据()。但在我的情况下,它甚至都不叫它。但来自widgets模块的QTableView似乎工作得很好 这是我的main.qml:- import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Window 2.15 Window { width: 640 height: 480 v

根据,如果模型是QAbstractTableModel,则标头将显示模型的水平headerData();否则,将显示模型的数据()。但在我的情况下,它甚至都不叫它。但来自widgets模块的QTableView似乎工作得很好

这是我的main.qml:-

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    id: root

    HorizontalHeaderView {
        id: header
        syncView: tb
        anchors.top: parent.top
        //        model: KoolModel // specify model explicitly also does not work 
        delegate: Button {
            text: display
        }
    }
    TableView {
        id: tb
        width: parent.width
        height: parent.height - header.height
        anchors.top: header.bottom

        onWidthChanged: forceLayout()

        model: KoolModel
        columnWidthProvider: function (_) {
            return root.width / 3
        }
        delegate: Frame {
            Label {
                text: display
                anchors.centerIn: parent
            }
        }
    }
}
这是我的模型:-

#include <QApplication>
#include <QGuiApplication>
#include <QTableView>

#include <QQmlApplicationEngine>
#include <QQmlContext>

#include <QAbstractTableModel>
#include <QString>
#include <map>

class Exams : public QAbstractTableModel {

private:
    struct DS {
        QString title;
        unsigned int marks;
        int state;
        std::vector<int>* questions = nullptr;
    };

    //id and exams
    std::map<int, DS> exams;

public:
    Exams()
    {
        for (int i = 0; i < 10; i++) {
            DS exam { "Exam" + QString::number(i), 0, (i * 3) / 2, nullptr }; // fill with garbage data for now
            exams[i] = exam;
        }
    }

    int rowCount(const QModelIndex& parent) const override
    {
        return exams.size();
    }

    int columnCount(const QModelIndex& parent) const override
    {
        return 3;
    }

    QVariant data(const QModelIndex& index, int role) const override
    {
        if (role == Qt::DisplayRole) {
            if (index.column() == 0)
                return exams.at(index.row()).title;
            else if (index.column() == 1)
                return exams.at(index.row()).marks;
            else if (index.column() == 2)
                return exams.at(index.row()).state;
        }
        qDebug() << "oops";
        return QVariant();
    }

    QVariant headerData(int section, Qt::Orientation orientation, int role) const override
    {
        qDebug() << "headerData is at least called";
        if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
            switch (section) {
            case 0:
                return QString("Title");
            case 1:
                return QString("Marks");
            case 2:
                return QString("state");
            }
        }
        return QVariant();
    }

    QHash<int, QByteArray> roleNames() const override
    {
        return { { Qt::DisplayRole, "display" } };
    }
};

int main(int argc, char* argv[])
{
    Exams exams;

    // widgets seems to work
    //    QApplication app(argc, argv);
    //    QTableView widget;
    //    widget.setModel(&exams);
    //    widget.show();

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("KoolModel", &exams);
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    engine.load(url);

    return app.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
课堂考试:公共QAbstractTableModel{
私人:
结构DS{
QString标题;
无符号整数标记;
int状态;
标准::向量*问题=nullptr;
};
//身份证和考试
地图考试;
公众:
考试()
{
对于(int i=0;i<10;i++){
DS-exam{“exam”+QString::number(i),0,(i*3)/2,nullptr};//暂时填充垃圾数据
考试[我]=考试;
}
}
int rowCount(常量QModelIndex&parent)常量重写
{
返回检查。大小();
}
int columnCount(常量QModelIndex&parent)常量重写
{
返回3;
}
QVariant数据(常量QModelIndex&index,int角色)常量覆盖
{
如果(角色==Qt::DisplayRole){
if(index.column()==0)
返回tests.at(index.row()).title;
else if(index.column()==1)
返回考试.at(index.row()).marks;
else if(index.column()==2)
返回.at(index.row()).state;
}

qDebug()该问题是由按钮属性和角色之间的命名冲突引起的。解决方案是通过模型显式访问角色:

// ...
delegate: Button {
    text: model.display
}
// ...
/。。。
代表:按钮{
文本:model.display
}
//…