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
Qt model.rowCount()赢得';t绑定到项目';s属性 我有一个代码,> ListVIEW/COD>,它是用一个自定义的C++模型初始化的,名为“代码> RooMead < /代码> Qml内部。 该模型继承QAbstractListModel,并将QVector定义为用于填充模型的私有成员_Qt_Qml_Scrollview_Qtquickcontrols2 - Fatal编程技术网

Qt model.rowCount()赢得';t绑定到项目';s属性 我有一个代码,> ListVIEW/COD>,它是用一个自定义的C++模型初始化的,名为“代码> RooMead < /代码> Qml内部。 该模型继承QAbstractListModel,并将QVector定义为用于填充模型的私有成员

Qt model.rowCount()赢得';t绑定到项目';s属性 我有一个代码,> ListVIEW/COD>,它是用一个自定义的C++模型初始化的,名为“代码> RooMead < /代码> Qml内部。 该模型继承QAbstractListModel,并将QVector定义为用于填充模型的私有成员,qt,qml,scrollview,qtquickcontrols2,Qt,Qml,Scrollview,Qtquickcontrols2,在我的应用程序窗口中我创建了一个对话框,在该对话框中我更改了模型并调用setList()函数对其进行更新。这个很好用 我还想将模型的大小连接到ScrollView的int属性。此属性将定义行布局的子项 问题是,当我试图将此属性绑定到模型的大小时,应用程序崩溃 仅供参考,模型的所有修改均遵循Qt的规则rowCount()是Q\u可调用的。我也尝试过使用onModelChanged处理程序,但这不起作用(我在文档中检查过,当发出modelReset()时会发出此信号,这是在setList()内部通过

在我的
应用程序窗口中
我创建了一个
对话框
,在该对话框中我更改了模型并调用
setList()
函数对其进行更新。这个很好用

我还想将模型的大小连接到
ScrollView
int
属性。此属性将定义
行布局的
子项

问题是,当我试图将此属性绑定到模型的大小时,应用程序崩溃

仅供参考,模型的所有修改均遵循Qt的规则
rowCount()
Q\u可调用的
。我也尝试过使用
onModelChanged
处理程序,但这不起作用(我在文档中检查过,当发出
modelReset()
时会发出此信号,这是在
setList()
内部通过
endResetModel()

我相信这是一个简单的过程(在我的项目中已经执行了很多次属性绑定),但没有按预期工作

我引用了我的项目的一些示例代码

//main.qml
ConfiguredChannels{
    id: configuredList
    anchors{
        left: parent.left
        top: devices.bottom
        right: tabs.left
        bottom: parent.bottom
    }
}

TabArea {
    id: tabs
    y: toolBar.height
    x: parent.width / 8
    anchors {
        top: toolBar.bottom
    }
    width: 3 * parent.width / 4
    height: 3 * parent.height / 4
    countPWM: configuredList.model.rowCount() //This is where I want to bind.
}


//ConfiguredChannels.qml
id: confChanView
header: confChanHeader
model: ChannelModel{
    id: rootModel
    list: channelList
}

//TabArea.qml
Item{
id: tabAreaRoot
property alias channelsPWM: channelsPWM
property int countPWM
ScrollView{
            id: scrollPWM
            anchors.fill: parent
            contentItem: channelsPWM.children
            horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOn
            RowLayout{
                id: channelsPWM
                spacing: 0
                Layout.fillHeight: true
                Layout.fillWidth: true
                Component.onCompleted: {
                    var namesPWM = [];
                    for (var i=0; i<countPWM; i++){
                        namesPWM.push("Channel"+(i+1));
                    }
                    createChannels(countPWM, "PWM", channelsPWM, namesPWM);
                }
            }
}
[编辑2] 尽管EDIT 1中的解决方案可以工作,并为我的
ScrollView
生成正确的
子对象,但我认为这还不够好,我认为最好的实现是通过调用
createStrips(countPWM)
函数来绑定模型的大小更改。例如:

\\main.qml
ConfiguredChannels{
id: configuredList
anchors{
    left: parent.left
    top: devices.bottom
    right: tabs.left
    bottom: parent.bottom
}
onModelChanged: tabs.createStrips(model.rowCount) //or an appropriate signal handler defined on C++ side
}
也许更好的是,创建
子对象
作为一个自定义的
qml
信号处理程序,每次更改模型的大小时都会发出该处理程序。(我像上面一样尝试了
onModelChanged
,但不起作用。在这种情况下,可能会丢失该信号)

[解决方案]

我遵循了被接受的答案的指示以及这个

我在名为
rowCount
的头文件中,使用
NOTIFY
rowCountChanged
以及信号
void rowCountChanged();
向模型的定义添加了
Q_属性
我用它来更新模型,我在它的实现结束时添加了
emit rowCountChanged();
。最后我用我的函数
createStrips(count)连接了这个信号
在QML内部。现在,每次更改模型的大小时,my
ScrollView
将自动更新显示为
行布局的子项的条带

\\ChannelModel.h
...
Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged)
...
signals:
void rowCountChanged();

\\ChannelModel.cpp
void ChannelModel::setList(ChannelList *list)
{
beginResetModel();
...
endRestModel();
emit rowCountChanged();
}

\\main.qml
Connections {
    target: configuredList.model
    onRowCountChanged: tabs.createStrips(configuredList.model.rowCount)
}

无法绑定到可调用的
Q_
,因为与更改信号没有关联

创建
Q\u属性(count READ rowCount NOTIFY rowCountChanged)
或类似内容。确保插入或删除行时发出信号
rowCountChanged

当然,如果你有一个

 Q_PROPERTY(count READ count NOTIFY countChanged)

 int count() { return rowCount(); }
并确保发出
countChanged


然后您可以绑定到属性
count
只有q属性允许绑定,在您的情况下
q\u可调用
不是,因此您必须创建它,为此,我们使用信号
rowsInserted
rowsRemoved
,如下所示:

*.h

    Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged)
public:
    ...
signals:
    void rowCountChanged();
*.cpp

//constructor
connect(this, &QAbstractListModel::rowsInserted, this, &YourModel::rowCountChanged);
connect(this, &QAbstractListModel::rowsRemoved, this, &YourModel::rowCountChanged);
*.qml

countPWM: configuredList.model.rowCount // without ()
注:

我假设在添加或删除元素时,您使用的是:

beginInsertRows(QModelIndex(), rowCount(), rowCount());
//append data
endInsertRows();
或:


您是否尝试使用调试器查找导致崩溃的错误?应用程序崩溃的行是什么?错误消息是什么?请提供所有相关代码,包括模型。哎呀,我忽略了问题中的崩溃部分。请提供您的模型的最小示例,您可以在其中调用
rowCount()
,如果这是导致应用程序崩溃的原因。绑定到
Q\u INVOKABLE
s不是真正的绑定,因为没有更改通知。我听从了你的建议,但应用程序仍然崩溃。在
setList()
内部,我确实使用了你提到的信号,前面是
beginResetModel()
,后面是
endResetModel())
。我试图将它们与
rowCountChanged
连接,但它们受到保护。@K.Tsakalis这不是你有一个选择,这是必须做的,Qt同意,beginXXX和endXXX立即通知,它们不是信号,而是函数。另一方面,rowCountChanged是我创建的一个信号,它不是一个方法。@K.Tsakalis rowsInserted和rowsRemoved是信号@K.Tsakalis要了解beginXXX和endXXX的用法,请检查以下内容:,我强调beginXXX和endXXX是mandatory@K.Tsakalis您的应用程序可能因错误的实现而崩溃,因此,如果您不提供帮助,则不可能实现。
beginInsertRows(QModelIndex(), rowCount(), rowCount());
//append data
endInsertRows();
beginRemoveRows(QModelIndex(), from, to)
// remove
endRemoveRows();