Cxfreeze 不在 mingw-w64 中复制 Qt6 样式

Cxfreeze not copy Qt6 Styles in mingw-w64

我在 msys2-mingw-w64 上安装了 PyQt6 和 cxfreeze

但在编译 python 文件后,在控制台中显示只是 ['Windows', 'Fusion'] 样式

这里是 cxfreeze

的 setup.py
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need
# fine tuning.
build_options = {'packages': [], 'excludes': []}

import sys
base = 'Win32GUI' if sys.platform=='win32' else None

executables = [ Executable('un.py', base=base)]

setup(name='qt',
      version = '1.0',
      description = '',
      options = {'build_exe': build_options},
      executables = executables)

和 python 文件:

from PyQt6 import QtCore, QtGui, QtWidgets
import sys

print(QtWidgets.QStyleFactory().keys()) # Print Available Qt6 Styles

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(30, 260, 731, 23))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(220, 380, 371, 25))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Win"))
        self.pushButton.setText(_translate("MainWindow", "Button"))


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())

我试图将 C:\msys2\mingw64\usr\share\qt6\plugins 复制到输出 EXE 目录和lib\PyQt6

尝试设置环境变量 QT_PLUGIN_PATH,例如在命令提示符中,在 运行 执行 EXE 文件之前,如下所示:

SET QT_PLUGIN_PATH=C:\msys2\mingw64\usr\share\qt6\plugins

您还可以运行通过Dependency Walker无法运行的EXE文件来查看是否缺少任何依赖DLL文件。因为您肯定将它们都放在与 EXE 文件相同的文件夹中(例如,来自 Qt 的 DLL 及其所有依赖项)。

我编写了一个工具作为 pedeps 项目的一部分来复制依赖 DLL 文件和 EXE 文件 (copypedeps -r)。您可以使用它来自动复制所有依赖项。