问题描述
我正在尝试使用带有列的TableView(qt5.12中引入的纯qml的新版本),它会动态调整它们的大小以填充额外的可用空间,但是它不起作用
这是我最小的可复制示例:-
main.qml:-
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
Window {
id: window
width: 640
height: 480
visible: true
title: qsTr("Hello World")
TableView {
anchors.fill: parent
model: KoolModel
// columnWidthProvider: function (_) { return parent.width/3} // Method 1,Does not work
delegate: Frame {
// implicitWidth: parent.width/3 //Method 2,Does not work
implicitWidth: 640/3 // works but not the solution for my problem
Label {
text: display
anchors.centerIn: parent
}
}
}
}
如果执行此代码,则会得到以下信息:-
这是所需的输出,但是当我调整窗口大小时,列应该扩展,这不会由于硬编码隐式宽度而发生
如果我使用columnWidthProvider: function (_) { return parent.width/3}
,那么我什么也没有,只有一个白色的窗口:-
,如果我尝试使用像这样的绑定 implicitWidth: parent.width/3
,我会得到:-
main.cpp:-
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "models/exams.hpp"
int main(int argc,char* argv[])
{
QGuiApplication app(argc,argv);
QQmlApplicationEngine engine;
Models::Exams exams;
engine.rootContext()->setContextProperty("KoolModel",&exams);
const QUrl url(QStringLiteral("qrc:/main.qml"));
engine.load(url);
return app.exec();
}
models / exam.cpp
#pragma once
#include <QAbstractTableModel>
#include <QString>
#include <map>
namespace Models {
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();
// qabstractitemmodel interface
int rowCount(const QModelIndex& parent) const override;
int columnCount(const QModelIndex& parent) const override;
QVariant data(const QModelIndex& index,int role) const override;
// qabstractitemmodel interface
public:
QHash<int,QByteArray> roleNames() const override;
};
} //end namespace Models
models / exam.cpp:-
#include "exams.hpp"
namespace Models {
Exams::Exams()
{
for (int i = 0; i < 200; i++) { //fill garbage data for Now
DS exam {
"Exam" + QString::number(i),(i * 3) / 2,nullptr
};
exams[i] = exam;
}
exams[2] = {
"Exam" + QString::number(10000000324),10,nullptr
};
}
int Exams::rowCount(const QModelIndex& parent) const
{
return exams.size();
}
int Exams::columnCount(const QModelIndex& parent) const
{
return 3;
}
QVariant Exams::data(const QModelIndex& index,int role) const
{
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;
}
return QVariant();
}
QHash<int,QByteArray> Exams::roleNames() const
{
return { { Qt::displayRole,"display" } };
}
} // end namepsace Models
我正在使用Archlinux存储库中的Qt 5.15
解决方法
请重新回答我的评论:出于性能原因,除非绝对必要,否则TableView不会重新计算其行高或列宽。但是只要宽度改变,就可以通过调用forceLayout()来强制使用它。
onWidthChanged: forceLayout()