When I use Loader to load my own component and change the value of the ProgressBar through it
the program always crash;If I don’t use Loader to load my own component, the program wouldn’t
crash, why?
os : mac 10.8.3
compiler: clang3.2
Qt ver : 5.1
main.qml
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Dialogs 1.0
import QtQuick.Layouts 1.0
import Test 1.0
ApplicationWindow{
id: root
title: "Color Correction"
color: syspal.window
width: 1450
height: 750
minimumHeight: 750
minimumWidth: 1400
SystemPalette {id: syspal}
//with Loader, this version would crash
Component{
id: compProgressTest
ProgressConnection{
}
}
Loader{
id: loader
sourceComponent: null
onStatusChanged: {
if(loader.status == Loader.Ready){
console.log("Ready")
}
}
}
Row{
anchors.fill: parent
Button{
text: "reload"
onClicked: {
loader.sourceComponent = null
loader.sourceComponent = compProgressTest
}
}
Button{
text: "run"
onClicked: {
if(loader.status == Loader.Ready){
loader.item.addProgressValue()
}
}
}
ProgressBar{
id: progressBar
maximumValue: loader.status == Loader.Ready ? loader.item.progressMaximum : 1
value: loader.status == Loader.Ready ? loader.item.progressValue : 0
onValueChanged: {
console.log("progress bar value = " + progressBar.value)
}
}
} //*/
/*
//without Loader, this version wouldn't crash
ProgressConnection{
id: progressConnection
}
Row{
anchors.fill: parent
Button{
text: "run"
onClicked: {
progressConnection.addProgressValue()
}
}
ProgressBar{
id: progressBar
maximumValue: progressConnection.progressMaximum
value: progressConnection.progressValue
onValueChanged: {
console.log("progress bar value = " + progressBar.value)
}
}
}//*/
}
.hpp
#ifndef PROGRESSCONNECTION_HPP
#define PROGRESSCONNECTION_HPP
#include <QObject>
class progressConnection : public QObject
{
Q_OBJECT
Q_PROPERTY(int progressMaximum READ progressMaximum WRITE setProgressMaximum NOTIFY progressMaximumChanged)
Q_PROPERTY(int progressValue READ progressValue WRITE setProgressValue NOTIFY progressValueChanged)
public:
explicit progressConnection(QObject *parent = 0);
Q_INVOKABLE void addProgressValue();
int progressMaximum() const;
int progressValue() const;
void setProgressMaximum(int value);
void setProgressValue(int value);
signals:
void progressMaximumChanged();
void progressValueChanged();
private:
void addProgressValueImpl();
private:
int progressMaximum_;
int progressValue_;
int size_;
};
#endif // PROGRESSCONNECTION_HPP
.cpp
#include "progressConnection.hpp"
progressConnection::progressConnection(QObject *parent) :
QObject(parent),
progressMaximum_(1),
progressValue_(0),
size_(100000)
{
}
void progressConnection::addProgressValue()
{
setProgressMaximum(size_);
setProgressValue(0);
addProgressValueImpl();
}
int progressConnection::progressMaximum() const
{
return progressMaximum_;
}
int progressConnection::progressValue() const
{
return progressValue_;
}
void progressConnection::setProgressMaximum(int value)
{
if(value != progressMaximum_){
progressMaximum_ = value;
emit progressMaximumChanged();
}
}
void progressConnection::setProgressValue(int value)
{
if(value != progressValue_){
progressValue_ = value;
emit progressValueChanged();
}
}
void progressConnection::addProgressValueImpl()
{
for(int i = 0; i != size_; ++i){
setProgressValue(i);
}
}
What is the problem?
↧