首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QQmlApplicationEngine列表索引超出范围的问题

QQmlApplicationEngine列表索引超出范围的问题
EN

Stack Overflow用户
提问于 2021-06-29 13:57:21
回答 1查看 470关注 0票数 0

我试图从这个网站中运行最后两个示例,最后两个示例都会出现root = engine.rootObjects()[0] # type: QObject IndexError: list index out of range错误(根布局的信号连接)(其他qml文件的信号连接)。

如果有帮助,我将所有示例文件放在同一个目录级别上,并将导入语句更改为Pyside6 (来自PySide6.QtCore.)而不是PySide2。如果代码更容易查看,我还添加了代码的版本:

main.py:

代码语言:javascript
运行
复制
import sys

from PySide6.QtCore import *
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtWidgets import QApplication


def say(s):
    print(s)


if __name__ == '__main__':
    app = QApplication()
    engine = QQmlApplicationEngine()
    engine.load(QUrl.fromLocalFile('main.qml'))
    # Get the root object.
    root = engine.rootObjects()[0]  # type: QObject
    # Find the target object. Since our target object is Window, which is the root object. So use it directly.
    target_view = root
    # Bind signal.
    target_view.say.connect(say)  # The former one is the signal of qml, and the latter one is from Python
    # say() method.
    
    sys.exit(app.exec())

main.qml:

代码语言:javascript
运行
复制
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Window 2.12

Window {
    visible: true
    width: 600; height: 400

    signal say(string s)

    Button {
        text: "hello"
        onClicked: say(text)
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2021-06-29 16:06:04

造成此错误的可能原因是:

  • .qml的路径不正确,因此没有加载.qml。
  • .qml的加载并不像您假设的那样是同步的。
  • .qml有一些错误(例如语法)

考虑到上述情况,解决办法是:

代码语言:javascript
运行
复制
import os
import sys
from pathlib import Path

from PySide6.QtCore import QCoreApplication, Qt, QUrl
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtWidgets import QApplication

CURRENT_DIRECTORY = Path(__file__).resolve().parent


def say(s):
    print(s)


if __name__ == "__main__":
    app = QApplication()
    engine = QQmlApplicationEngine()
    filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
    url = QUrl.fromLocalFile(filename)

    def handle_object_created(obj, obj_url):
        if obj is None and url == obj_url:
            QCoreApplication.exit(-1)
        else:
            root = engine.rootObjects()[0]
            target_view = root
            target_view.say.connect(say)

    engine.objectCreated.connect(handle_object_created, Qt.QueuedConnection)
    engine.load(url)

    sys.exit(app.exec())

但是无论如何,我不喜欢使用rootObjects,而是导出一个QObject:

代码语言:javascript
运行
复制
import os
import sys
from pathlib import Path

from PySide6.QtCore import QCoreApplication, QObject, Qt, QUrl, Signal
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtWidgets import QApplication

CURRENT_DIRECTORY = Path(__file__).resolve().parent


class Helper(QObject):
    say = Signal(str)


def say(s):
    print(s)


if __name__ == "__main__":
    app = QApplication()
    engine = QQmlApplicationEngine()

    helper = Helper()
    helper.say.connect(say)

    engine.rootContext().setContextProperty("helper", helper)

    filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
    url = QUrl.fromLocalFile(filename)

    def handle_object_created(obj, obj_url):
        if obj is None and url == obj_url:
            QCoreApplication.exit(-1)

    engine.objectCreated.connect(handle_object_created, Qt.QueuedConnection)
    engine.load(url)

    sys.exit(app.exec())
代码语言:javascript
运行
复制
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Window 2.12

Window {
    visible: true
    width: 600
    height: 400

    Button {
        text: "hello"
        onClicked: helper.say(text)
    }

}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68180188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档