如何使用QML和多个python文件构建PyQt5项目?

时间:2016-06-22 17:13:06

标签: python qt qml pyqt5

我刚刚开始使用PyQt5和QML,目前有一个main.py文件,它有一些简单的代码:

if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.load('QML/MainWindow.qml')
    sys.exit(app.exec_())

在我的MainWindow.QML中,我有一个ApplicationWindow,它有一个工具栏和一个StackView,当前根据按钮点击等推送和弹出不同的QML文件等。

我很好奇是否有适当的方法为每个QML文件使用Python文件,类似于WPF,其中有Settings.xaml和Settings.xaml.cs。我想要Settings.qml以及一个Settings.py文件,该文件将为其中的页面划分模型和逻辑,而不是拥有一个庞大的main.py文件。

1 个答案:

答案 0 :(得分:1)

我最后通过以下方式解决了这个问题:

Main.py:

public function store(Request $request)
{
    $title = $request->input('title');
    $category_id = $request->input('category_id');
    $description = $request->input('description');
    $price = $request->input('price');

    Classified::create([
            'title' =>  $this->title,
            'category_id' => $this->category_id,
            'description' => $this->description,
            'price' => $this->price
    ]);

    return \Redirect::route('classifieds.index')
        ->with('message', 'Ad created');
}

Home.py(StackView中的第一个初始页面)

def settings_clicked():
    stackView.push(Settings(engine, stackView).load())

if __name__ == '__main__':
    app = QGuiApplication(sys.argv)

    engine = QQmlEngine()

    component = QQmlComponent(engine)
    component.loadUrl(QUrl('QML/MainWindow.qml'))

    mainWindow = component.create()

    stackView = mainWindow.findChild(QObject, "stackView")

    home = Home(engine, stackView)
    home.load()

    sys.exit(app.exec_())

Settings.py:

class Home:

    def __init__(self, engine, stackview):
        self.engine = engine
        self.stackview = stackview

    def load(self):
        self.component = QQmlComponent(self.engine)
        self.component.loadUrl(QUrl('QML/Home.qml'))

        self.home = self.component.create()

        self.settings_button = self.home.findChild(QObject, "settingsButton")
        self.settings_button.clicked.connect(self.settings_clicked)

        self.stackview.push(self.home)

    def settings_clicked(self):
        self.settings = Settings(self.engine, self.stackview)
        self.settings.load()

这将允许我将业务逻辑组织到不同的Python页面中,并为GUI提供单独的QML文件。