PyQt(1)

初次尝试学习PyQt。之前做过MFC和java自带的图形界面,有一丢丢经验。

之前安装过Anaconda3,已有一些包,只需要引入PyQt包即可。具体配置转自:

https://blog.csdn.net/zjm12343/article/details/79707275

首先进入Anaconda promot(安装过程可以使用非官方源加速或者使用ss+Proxifier)

安装SIP:

pip install Sip

安装PyQt5:

pip install PyQt5

安装PyQt5 tools:

pip install PyQt5-tools

之后在 ./Anaconda3/Lib/site-packages/pyqt5-tools 目录下可找到 designer.exe 。

添加环境变量:

Name: QT_QPA_PLATFORM_PLUGIN_PATH
Value: D:\Python\Python36\Lib\site-packages\PyQt5\Qt\plugins  


配置PyCharm:

1、打开PyCharm,执行快捷键ctrl+alt+s打开设置界面,输入tool,点开external tools,配置qtdesigner。

点击左上角的加号,作如下配置:

在Qt Designer的设置中,Program选择PyQt安装目录中 designer.exe 的路径

Work directory 使用变量 $FileDir$ 

2、设置“PyUIC” -- 这个主要是用来将 Qt界面 转换成 py代码
在PyUIC的设置中,其他的都差不多,Program 写入Python的地址,Parameters写入
-m PyQt5.uic.pyuic  $FileName$ -o $FileNameWithoutExtension$.py
把上面的Python路径修改成自己的即可!
Work directory 使用变量 $FileDir$


接下来就可以在PyCharm中使用Qt Designer并自动将图形界面转换为代码了。

具体使用方法参考:

https://blog.csdn.net/zjm12343/article/details/79709414

由于每次重新生成代码都会把文件重写一遍,所以推荐将除界面外的所有内容(包括信号处理等)都加到外部文件。

信号处理参考:

https://blog.csdn.net/baidu_34045013/article/details/52132804

我在实际使用信号处理时遇到过一个问题:

由于对象初始化代码在A文件,我在B文件的类的__init(self)__中生成一个A的实例,并设置信号:

class initMW:
    def __init__(self, widget):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(widget)
        self.ui.Button.clicked.connect(self.bc)


    def bc(self):
        print('pressed!')
        self.ui.Slider.setSliderPosition(20)

此时信号没有响应。神奇的是在第5行加上注释之后,调试走到那里再继续,之后就可以了。怀疑(瞎猜)是窗口初始化是一个多线程工作,或者走到第5句的时候还没有初始化完,因此信号没有创造成功。经参考:

https://blog.csdn.net/u010255072/article/details/84794663

方案后,修改代码为:

class initMW:
    def __init__(self, widget):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(widget)
        QTimer.singleShot(0, self.initEvents)

    def initEvents(self):
        self.ui.Button.clicked.connect(self.bc)


    def bc(self):
        print('pressed!')
        self.ui.Slider.setSliderPosition(20)

此时信号传递成功。

 


19.01.15 补充:

关于上文链接(https://blog.csdn.net/zjm12343/article/details/79709414)中有一处问题:

7、删除如下三行:
MainWindow.setCentralWidget(self.centralwidget)、
MainWindow.setMenuBar(self.menubar)、

MainWindow.setStatusBar(self.statusbar)

如果不这么做会出现类似如下错误:

Traceback (most recent call last):
  File "G:\Python\Database Kast Thuis\PyQt Test\MainMenu_ui.py", line 84, in <module>
    ex = Ui_MainWindow()
  File "G:\Python\Database Kast Thuis\PyQt Test\MainMenu_ui.py", line 16, in __init__
    self.setupUi(self)
  File "G:\Python\Database Kast Thuis\PyQt Test\MainMenu_ui.py", line 55, in setupUi
    MainWindow.setCentralWidget(self.centralwidget)
AttributeError: 'Ui_MainWindow' object has no attribute 'setCentralWidget'

为了不用每次都删,特别查了一下报错的原因,没太懂原因,似乎是因为类用法的问题,把QMainWindow的方法使用在了QWidget上,参考下面的方法修改后不再报错:

https://stackoverflow.com/questions/43260595/attributeerror-ui-mainwindow-object-has-no-attribute-setcentralwidget-pyqt5

具体使用了Solution 2进行修改:

class initMW(QMainWindow):
    def __init__(self, parent = None):
        super(initMW, self).__init__(parent = parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QTimer.singleShot(0, self.initEvents)

def showWindow():
    app = QtWidgets.QApplication(sys.argv)
    w = initMW()
    w.show()
    sys.exit(app.exec_())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值