在配置爲在Windows 7 x64下使用MinGW(來自32位QT分發版)的QT 5.4.2項目中,我發現程序工作正常通常情況下,但在GDB崩潰。我已經追溯到從QML傳遞給我的回調函數的無效參數。它是一個在用作上下文屬性的對象上定義的函數。該函數接收QString作爲其參數。在沒有gdb的情況下執行時,其值如預期。對於gdb,它包含垃圾(不是隨機的垃圾,但每次都是相同的垃圾)。示例代碼:Windows上的QT:從GDB運行時函數參數無效
class CallbackSink : public QObject {
Q_OBJECT
public:
CallbackSink() {}
Q_INVOKABLE virtual QString callTestString2(const QString &str) { return QString(""); }
virtual ~CallbackSink() {}
};
class Sink : public CallbackSink {
Q_OBJECT
public:
Sink() {}
Q_INVOKABLE virtual QString callTestString2(const QString &str) {
const char *_str = str.toUtf8().constData();
printf("_str=%s\n", _str);
const char *_ret = "fdsa";
QString ret = QString::fromUtf8(_ret);
return ret;
}
virtual ~Sink() {}
};
QT初始化代碼:
gui.h:
struct Gui {
public:
std::unique_ptr<QApplication> app;
std::unique_ptr<QQmlApplicationEngine> engine;
std::unique_ptr<CallbackSink> sink;
QQuickWindow *window;
Gui(std::unique_ptr<CallbackSink> s) : sink(std::move(s)) {}
int run();
virtual ~Gui() {}
};
gui.cpp:
int Gui::run() {
char x[] = "BLAH BLAH";
char *argv = x;
int argc = 1;
app = std::unique_ptr<QApplication>(new QApplication(argc,&argv));
engine = std::unique_ptr<QQmlApplicationEngine>(new QQmlApplicationEngine());
QQmlContext *objectContext = engine->rootContext();
objectContext->setContextProperty("callbacks", &*sink);
engine->load(QUrl("qrc:///myqml.qml"));
QObject *topLevel = engine->rootObjects().value(0);
window = qobject_cast<QQuickWindow *>(topLevel);
window->show();
int r = app->exec();
return r;
}
及相關QML片段:
Text {
id: mytext
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
textFormat: Text.RichText
text: '<p>call 2: `' + callbacks.callTestString2('foo') + '`'
}
我想值得注意的是,我將所有的GUI代碼編譯爲一個DLL,並且可執行文件從一個單獨的項目鏈接到它。
當從gdb下運行,我認爲這是印刷(同無關的參數值的東西):
_str=ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■☺!=4/Ц♠↑☺
UPDATE:還試圖使用Qt 5.5,同樣的問題。
UPDATE 2:我從QtCreator中的模板創建了一個新的QtQuick應用程序項目,並對其進行了最小的更改以重現此問題。它也發生在這個項目中。
太棒了!非常感謝! – kirillkh