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
)。您可以使用它来自动复制所有依赖项。
我在 msys2-mingw-w64 上安装了 PyQt6 和 cxfreeze
但在编译 python 文件后,在控制台中显示只是 ['Windows', 'Fusion'] 样式
这里是 cxfreeze
的 setup.pyfrom 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
)。您可以使用它来自动复制所有依赖项。