鱼C论坛

 找回密码
 立即注册
查看: 3277|回复: 17

[已解决]分享一个自己用PYQT做的计算器,顺便也问一些问题。望各位指教。

[复制链接]
发表于 2017-6-26 15:58:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ooxx7788 于 2017-6-26 16:04 编辑

1

1


计算器可以记录多次计算记录

2

2

每次计算时,还有单独的大字体人性化功能。

当然还有快捷键,=号用了小键盘的回车替代。更方便小键盘使用。不知道多快捷键怎么设定。

虽然界面上只设置了加减乘除,但因为是用python做的,实际上还支持**,//。也就是还能做幂运算和地板除。

好了,上面介绍结束,开始提问了。

1、可以看出,我采用的是无边框设计。拖动窗体功能呢,我已经实现了一部分。
目前可以拖动窗口的地方包括:
1)主窗体的侧边。也就是两侧非常细条的地方。
2)当第一次拖动之后,可以在数字按钮上实现鼠标拖动,但会出现鼠标指针跳动的情况(其实就是跳至上一次在窗体拖动的位置上)
我采用的无边框代码如下:
  1. self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowTitleHint)
复制代码

实现鼠标拖动的代码如下:
  1.     def mousePressEvent(self, event):
  2.         if event.button() == QtCore.Qt.LeftButton:
  3.             self.dragPosition = event.globalPos() - self.frameGeometry().topLeft()
  4.             event.accept()

  5.     def mouseMoveEvent(self, event):
  6.         if event.buttons() == QtCore.Qt.LeftButton:
  7.             self.move(event.globalPos() - self.dragPosition)
  8.             event.accept()
复制代码

我想实现的可以拖动的部位包括,顶端menubar,中间的QBrowser,不知道应该怎么该。

2、从下图可以看出,关于中采用的Qmessage.about没有实现无边框效果,而且QSS布置也不知道怎么修改。因为我QSS的修改全是在QT designer里面完成的。这个是单独弹出来的窗体,所以我就不知道怎么设置了。

3

3


3、还有一个看我的代码中可以发现有大量的重复代码,形如:
  1. self.pushButton_0.clicked.connect(self.btn0)
  2.         self.pushButton_1.clicked.connect(self.btn1)
  3.         self.pushButton_2.clicked.connect(self.btn2)
  4.         self.pushButton_3.clicked.connect(self.btn3)
  5.         self.pushButton_4.clicked.connect(self.btn4)
  6.         self.pushButton_5.clicked.connect(self.btn5)
复制代码

  1.     def btn0(self):
  2.         self.context += '0'
  3.         self.textBrowser.setFontPointSize(22)
  4.         self.textBrowser.setText(self.context)
  5.    
  6.     def btn1(self):
  7.         self.context += '1'
  8.         self.textBrowser.setFontPointSize(22)
  9.         self.textBrowser.setText(self.context)
复制代码


自己考虑过,可能可以用字典进行一些调整,但是还不是太满意,不知道没有好的使之更pythonic的方法。

最后,附件是代码。
游客,如果您要查看本帖隐藏内容请回复

最佳答案
2017-6-27 19:26:34
1. 拖动部分。 你的拖动代码写在了 主界面类里。 你想拖动哪个就在哪个类里也写一份。
  1. class Main():
  2.     def dragCodes():
  3.       pass

  4. class Menu():
  5.     def dragCodes():
  6.       # 这里注意move不再是Menu类move也就是不能是self.move
  7.       # 你想主界面拖动就索引到主界面去。
  8.       pass.
复制代码


重用优化部分。
如果设置之后基本不再改动。可以这样。

  1. class MyButton(QPushButton):
  2.     def __init__(self, parent=None, text="", myText=""):
  3.       super(...).__init__(text)
  4.       self.parent = parent
  5.       self.myText = myText
  6.       self.clicked.connect(self.connectFunc)

  7.     def connectFunc(self):
  8.       self.parent.content += self.myText
  9.       self.textBrowser.setFontPointSize(22)
  10.       self.parent.textBrwoser.setText(self.parent.content)
复制代码


然后在创建self.pushButton_1...的时候直接self.pushButton_1 = MyButton(self, "button1", "1")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-26 16:38:43 | 显示全部楼层
支持~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-26 17:46:18 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-26 18:40:35 | 显示全部楼层
首先,我还没学到这一块,对于界面模块这里还有没看明白
其次,关于按钮代码重复这块,借鉴其它技术的思路,LZ能不能把所有的按钮内容都放在list里,然后在开发层面上就放一个按钮,通过嵌套的双层循环,在程序运行的时候把按钮填充进界面?
类似这样:
  1. button_list =[ ["C", "Back", "(" , ")"], [……], ……]
  2. for ver_coor in range(5):
  3.    for tran_coor in range(4):
  4.       #构造一个button
  5.       #button.value = button_list[ver_coor][tran_coor]
  6.       #button的横坐标 += 偏移量
  7.    ##button的纵坐标 += 偏移量
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-26 18:51:06 | 显示全部楼层
china25qd 发表于 2017-6-26 18:40
首先,我还没学到这一块,对于界面模块这里还有没看明白
其次,关于按钮代码重复这块,借鉴其它技术的思路 ...

因为我采用了界面和逻辑分离的方式进行组织。
而界面这一块,我主要是利用QTdesigner用uic直接转换出来的,其实怎么生成界面,我不怎么在乎,因为我根本也不看这一部分代码。虽然在界面文件里面也确实是大量的重复代码。
在逻辑层中,主要包括的是一些特殊的设置,动作,信号和槽,所以用循环的方式是不可行的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 19:33:49 | 显示全部楼层
重复代码那里可以用for循环来优化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 19:37:40 | 显示全部楼层
ooxx7788 发表于 2017-6-26 18:51
因为我采用了界面和逻辑分离的方式进行组织。
而界面这一块,我主要是利用QTdesigner用uic直接转换出来 ...

我看了下两个文件里的代码,发现循环是能做的,界面部分可以用两个for循环生成
业务逻辑部分可通过“pushButton”事件返回的值来判定,这里的循环是循环检测判定
  1. #while not 捕获“=”点击事件:
  2.         #self.context += 点击信号
  3.         self.textBrowser.setFontPointSize(22)
  4.         self.textBrowser.setText(self.context)
复制代码

就是在按下“=”后结束写入操作,并不影响你最后的运算逻辑(伪代码我都注释掉了,相信明白的人自然看得懂)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 08:37:59 | 显示全部楼层
china25qd 发表于 2017-6-26 19:37
我看了下两个文件里的代码,发现循环是能做的,界面部分可以用两个for循环生成
业务逻辑部分可通过“pus ...

谢谢你的想法,我再考虑考虑。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 12:54:20 | 显示全部楼层
这个不错啊。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 15:03:58 | 显示全部楼层
@wei_Y 召唤大佬来帮我看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 16:11:42 | 显示全部楼层
先看看,学习一下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 19:26:34 | 显示全部楼层    本楼为最佳答案   
1. 拖动部分。 你的拖动代码写在了 主界面类里。 你想拖动哪个就在哪个类里也写一份。
  1. class Main():
  2.     def dragCodes():
  3.       pass

  4. class Menu():
  5.     def dragCodes():
  6.       # 这里注意move不再是Menu类move也就是不能是self.move
  7.       # 你想主界面拖动就索引到主界面去。
  8.       pass.
复制代码


重用优化部分。
如果设置之后基本不再改动。可以这样。

  1. class MyButton(QPushButton):
  2.     def __init__(self, parent=None, text="", myText=""):
  3.       super(...).__init__(text)
  4.       self.parent = parent
  5.       self.myText = myText
  6.       self.clicked.connect(self.connectFunc)

  7.     def connectFunc(self):
  8.       self.parent.content += self.myText
  9.       self.textBrowser.setFontPointSize(22)
  10.       self.parent.textBrwoser.setText(self.parent.content)
复制代码


然后在创建self.pushButton_1...的时候直接self.pushButton_1 = MyButton(self, "button1", "1")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-6-27 19:33:32 | 显示全部楼层
wei_Y 发表于 2017-6-27 19:26
1. 拖动部分。 你的拖动代码写在了 主界面类里。 你想拖动哪个就在哪个类里也写一份。

还有一个,关于的QMessagebox.about的无边框实现呢?应该要怎么写?是不是在self.setWindowFlags里面有一个对应的类呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 19:39:31 | 显示全部楼层
ooxx7788 发表于 2017-6-27 19:33
还有一个,关于的QMessagebox.about的无边框实现呢?应该要怎么写?是不是在self.setWindowFlags里面有一 ...

这个我也没试过。不过基本上应该是你直接变量里设置setWindowFlags。
比如。
self.xxx = QMessageBox()
self.xxx.setWindowFlags(....)

如果有效,你还可以用按钮的方法重新定义一个类。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 22:19:05 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-30 10:03:11 | 显示全部楼层
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 16:31:34 | 显示全部楼层
哈哈哈哈哈哈哈哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-10 22:05:09 | 显示全部楼层
太厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 08:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表