View Full Version : سوال: باز نشدن پنجره با کلیک دوم در qml
ravand
شنبه 15 اسفند 1394, 03:28 صبح
سلام
این یه برنامه ی ساده هست که من با qml نوشتم:
import QtQuick 2.0
import QtQuick.Controls 1.3
Item {
width: 200; height: 200
Loader { id: pageLoader }
Button {
width: 50
height: 27
text: qsTr("کلیک کنید")
onClicked: {
pageLoader.source = "azmayesh.qml"
}
}
}
azmayesh.qml
import QtQuick 2.0
import QtQuick.Window 2.0
Window {
visible: true
width: 360
height: 360
title: "MyWindow"
Text {
text: "Hello world!"
anchors.centerIn: parent
}
}
وقتی بار اول روی دکمه کلیک میکنم پنجره باز میشه ولی برای بار دوم که کلیک میکنم باز نمیشه.
حامد مصافی
شنبه 15 اسفند 1394, 06:49 صبح
برای بار دوم وقتی دکمه کلیک میشه خصوصیت source رو به همون مقداری که الان هست تغییر میده. پس اتفاقی نمیافته.
بهتر نیست از Dialog (http://doc.qt.io/qt-5/qml-qtquick-dialogs-dialog.html) استفاده کنید؟
ravand
شنبه 15 اسفند 1394, 07:56 صبح
برای بار دوم وقتی دکمه کلیک میشه خصوصیت source رو به همون مقداری که الان هست تغییر میده. پس اتفاقی نمیافته.
بهتر نیست از Dialog (http://doc.qt.io/qt-5/qml-qtquick-dialogs-dialog.html) استفاده کنید؟
این کار رو کردم ولی این اخطار رو میده هر چی ام سرچ کردم به نتیجه ای نرسید:
2016/03/05 14:12:16 .:0: QQuickView only supports loading of root objects that derive from QQuickItem.
If your example is using QML 2, (such as qmlscene) and the .qml file you
loaded has 'import QtQuick 1.0' or 'import Qt 4.7', this error will occur.
To load files with 'import QtQuick 1.0' or 'import Qt 4.7', use the
QDeclarativeView class in the Qt Quick 1 module.
کامبیز اسدزاده
شنبه 15 اسفند 1394, 08:05 صبح
سلام
این یه برنامه ی ساده هست که من با qml نوشتم:
import QtQuick 2.0
import QtQuick.Controls 1.3
Item {
width: 200; height: 200
Loader { id: pageLoader }
Button {
width: 50
height: 27
text: qsTr("کلیک کنید")
onClicked: {
pageLoader.source = "azmayesh.qml"
}
}
}
azmayesh.qml
import QtQuick 2.0
import QtQuick.Window 2.0
Window {
visible: true
width: 360
height: 360
title: "MyWindow"
Text {
text: "Hello world!"
anchors.centerIn: parent
}
}
وقتی بار اول روی دکمه کلیک میکنم پنجره باز میشه ولی برای بار دوم که کلیک میکنم باز نمیشه.
شما دارید یک Window رو در داخل یک Loader فراخوانی میکنید و متاسفانه این روش درستی نیست، از لودر زمانی استفاده میشه که قراره یک آیتم خاصی در همان فرم والد فراخوانی بشه.
برای این کار به صورت زیر عمل کنید فایل main رو به صورت زیر باز نویسی کنید:
import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
visible: true
id:mywindow
Loader { id: pageLoader }
Button {
width: 50
height: 27
text: qsTr("کلیک کنید")
onClicked: {
var component = Qt.createComponent("qrc:/azmayesh.qml")
var window = component.createObject(mywindow)
window.show()
}
}
}
تغییراتی که دادم تعریف یک شناسه برای window و بعد کد های داخل onClicked هست.
ravand
شنبه 15 اسفند 1394, 08:12 صبح
چیزی که نوشتید این اخطار رو میده:
2016/03/05 14:25:06 .:0: QQmlComponent: Component is not ready
2016/03/05 14:25:06 alert.qml.:17: file:///F:/workspace/alert.qml.:17: TypeError
: Cannot call method 'show' of null
2016/03/05 14:25:08 .:0: QQmlComponent: Component is not ready
2016/03/05 14:25:08 alert.qml.:17: file:///F:/workspace/alert.qml.:17: TypeError
: Cannot call method 'show' of null
کامبیز اسدزاده
شنبه 15 اسفند 1394, 08:42 صبح
چیزی که نوشتید این اخطار رو میده:
2016/03/05 14:25:06 .:0: QQmlComponent: Component is not ready
2016/03/05 14:25:06 alert.qml.:17: file:///F:/workspace/alert.qml.:17: TypeError
: Cannot call method 'show' of null
2016/03/05 14:25:08 .:0: QQmlComponent: Component is not ready
2016/03/05 14:25:08 alert.qml.:17: file:///F:/workspace/alert.qml.:17: TypeError
: Cannot call method 'show' of null
نسخه Qt شما چنده؟
ravand
شنبه 15 اسفند 1394, 08:51 صبح
نسخه اش 5.5 هست.
کامبیز اسدزاده
شنبه 15 اسفند 1394, 08:53 صبح
نسخه اش 5.5 هست.
این رو تست کنید :
فایل main :
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
Window {
visible: true
id:mywindow
width: 640
height: 480
Button {
width: 50
height: 27
text: qsTr("کلیک کنید")
anchors.centerIn: parent
onClicked: {
var component = Qt.createComponent("qrc:/azmayesh.qml")
var window = component.createObject(mywindow)
window.show()
}
}
}
فایل فرم دوم:
import QtQuick 2.0
import QtQuick.Window 2.0
Window {
visible: true
width: 360
height: 360
title: "MyWindow"
Text {
text: "Hello world!"
anchors.centerIn: parent
}
}
مسیر فایل رو هم مشخص کنید.
کامبیز اسدزاده
شنبه 15 اسفند 1394, 08:54 صبح
نسخه اش 5.5 هست.
این رو تست کنید :
فایل main :
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
Window {
visible: true
id:mywindow
width: 640
height: 480
Button {
width: 50
height: 27
text: qsTr("کلیک کنید")
anchors.centerIn: parent
onClicked: {
var component = Qt.createComponent("qrc:/azmayesh.qml")
var window = component.createObject(mywindow)
window.show()
}
}
}
فایل فرم دوم azmayesh.qml
import QtQuick 2.0
import QtQuick.Window 2.0
Window {
visible: true
width: 360
height: 360
title: "MyWindow"
Text {
text: "Hello world!"
anchors.centerIn: parent
}
}
مسیر فایل رو هم مشخص کنید.
ravand
شنبه 15 اسفند 1394, 08:59 صبح
باز هم همون پیغام قبلی:
2016/03/05 15:16:53 .:0: QQmlComponent: Component is not ready2016/03/05 15:16:53 alert.qml.:20: file:///F:/workspace/alert.qml.:20: TypeError
: Cannot call method 'show' of null
کامبیز اسدزاده
شنبه 15 اسفند 1394, 09:11 صبح
باز هم همون پیغام قبلی:
2016/03/05 15:16:53 .:0: QQmlComponent: Component is not ready2016/03/05 15:16:53 alert.qml.:20: file:///F:/workspace/alert.qml.:20: TypeError
: Cannot call method 'show' of null
نباید این خطارو بده! این خطا زمانی رخ میده که فایل مورد نظر برای Component شناسایی نشده باشه!
برای اطمینان من دو پروژه از نوع Window و ApplicatonWindow قرار دادم فایل .pro رو باز و تست کنید.
139440
ravand
شنبه 15 اسفند 1394, 09:24 صبح
فهمیدم مشکل از کجاست!
من از زبان go یا همون golang برای اجرای کدهای qml استفاده میکردم. وقتی با golang تست میکردم اخطار میداد ولی وقتی با qt creator کار کردم. دیدم اصلا مشکلی پیش نمیاد و برنامه ی شما رو بخوبی اجرا میکنه.
Dialogs هم توی go مشکل داشت ولی با qt creator مشکلی نداشت. شاید باید برای go نصب بشه.
ممنونم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.