QMLとC++を連携させたGUIアプリケーションを作っています。
main.cppの中で、callback.hのCallbackクラスと、test.qmlの「id: callback」を接続しています。
CustomButton.qmlのonPressed:が実行されると、callback.hのsetInput()が実行されます。
setInput()の中では、iとvecを初期化しようとしています。
しかし、vec.clear()を実行すると、SIGSEGV(Segmentation fault)で強制終了してしまいます。
デバッガで調べてみたところ、iは初期化されていますが、vecは「アクセス不可」と表記されていました。
試しに、QMLと連携せずに、Callbackクラスを実体化して、setInput()を呼んでみたところ、iもvecも初期化することができました。このときには、vecは「アクセス不可」ではなく、「0個の項目」と表記されていました。
なぜ、QMLとC++を連携させると、vec.clear()で落ちてしまうのでしょうか。
ご存じの方がおりましたら、教えて頂けると幸いです。
以下に、主要な箇所だけ抜粋したコードを示します。
main.cpp
c++
1#include "callback.h" 2int main(int argc, char *argv[]){ 3 qmlRegisterType<Callback>("io.qt.callback", 1, 0, "Callback"); 4}
callback.h
c++
1class Callback : public QObject 2{ 3 Q_OBJECT 4 5 // m_inputのプロパティ 6 Q_PROPERTY(QString input // プロパティ名 7 READ input // getter 8 WRITE setInput // setter 9 NOTIFY inputChanged) 10 11public: 12 explicit Callback(QObject *parent = nullptr); 13 14 // getter 15 QString input(); 16 17 // setter 18 void setInput(const QString &input){ 19 i = 10; 20 vec.clear(); 21 } 22 23private: 24 int i; 25 vector<string> vec; // 数値と演算子の配列("10", "+", "3", "=") 26};
test.qml
QML
1 // コールバック(main.cppで、Callbackクラスに接続している) 2 Callback { 3 id: callback 4 }
CustomButton.qml
QML
1 // コールバック 2 onPressed: { 3 // CallbackクラスのsetInput()にtextを送る 4 callback.input = text 5 }
回答1件
あなたの回答
tips
プレビュー