Windows上のMy Qtクイックアプリケーションが非常に奇妙なクラッシュを経験しています。QtクイックWindowsアプリがクラッシュして、C++がベクターの要素(範囲内)にアクセスしようとしました
QObjectVector
という由来のC++クラスがあり、QML側がコンテナ内のQObjectポインタにアクセスできるようになりました。 QML側では、そのコンテナ内のオブジェクトの名前を表示するボタンがたくさんあります。マウスホイールをスクロールすると、各ボタンのcurrentItem
プロパティが手動で更新されます。
奇妙、およびのみ時々、高速スクロールの予測不能数、プログラムのクラッシュ(動作を停止)した後。デバッグ後、私は、at
の機能がm_data[i]
になったときにクラッシュが発生することを発見しました。 i
が有効な範囲[0、m_data.size()
]の範囲内にあることを確認しました。したがって、これはインデックス範囲外のエラーではありません。私の推測では、どうにかして、QMLエンジンはメモリを管理しようとしているときにヒープ上のオブジェクトを削除するということです。
QObjectVector.h
#pragma once
#include <QObject>
#include <QVector>
#include "Types.h"
namespace LPP
{
class QObjectVector : public QObject
{
Q_OBJECT
Q_PROPERTY(Int size READ size NOTIFY sizeChanged)
public:
explicit QObjectVector();
virtual ~QObjectVector();
Int size();
Q_INVOKABLE QObject* at(Int);
void push(QObject*);
void remove(Int);
void remove(QObject*);
QVector<QObject*> &getData();
bool deleteChildrenOnDestroy;
private:
QVector<QObject*> m_data;
signals:
void sizeChanged();
public slots:
};
}
QObjectVector.cpp
...
QObject* QObjectVector::at(Int i)
{
qDebug() << "size: " << this->m_data.size();
for (int i = 0; i < this->m_data.size(); i++){
qDebug() << "i: " << i << " item: ";
//when I scroll rapidly, crash happens here when I trace objects in vector
qDebug() << this->m_data[i];
}
qDebug() << "returning.";
return (i >= 0 && i < this->m_data.size()) ? this->m_data[i] : nullptr;
}
....
ButtonContainer.qml
....
//this function is called when I scroll mouse wheel.
//itemList contains list of Buttons
function refreshDisplay() {
var i, j = 0;
for (i = 0; i < itemList.length; i++){
itemList[i].visible = itemList[i].enabled = false;
}
var start = Utils.clamp(Math.floor(scrollView.flickableItem.contentY/(itemHeight + itemVSpacing)), 0, currentFolder.size);
var end = Utils.clamp(Math.ceil((scrollView.flickableItem.contentY + scrollView.flickableItem.height)/(itemHeight + itemVSpacing)), 0, currentFolder.size);
var item;
for (i = start; i < end; i++){
if (j >= itemList.length){
itemList.push(tableItem_comp.createObject(tableArea));
}
itemList[j].visible = itemList[j].enabled = true;
item = currentFolder.at(i);
itemList[j].currentItem = item;
j++;
}
}
....
Button.qml
....
property var currentItem: null;
anchors.left: parent.left
anchors.right: parent.right
SimpleButton {
id: button
width: 100
height: 50
text: currentItem.name;
onClicked: {
viewer.select(currentItem);
}
}
....
この問題は非常に奇妙で予測不可能なことです。それを解決することは私のアプリの開発にとって非常に重要なので、どうかお願いします。
ありがとうございました!
トミー
説明を削除して実際のコードを掲載してください。エラーが[MCVE]のどこにあるのか –