PyQt5 自我学习总结

PyQt5 自我学习总结

1.widget,mainwindow,dialog的区别

在创建ui文件的时候,会出现这三种类型的设置。
https://blog.csdn.net/mars_xiaolei/article/details/89947412
如果想要设置菜单栏,需要使用mainwindow。


2.关于布局时空间之间的距离以及空间的大小

在这里插入图片描述
主要通过layoutstrech和layoutspacing调整空间的间距和相对大小。
除此以外,还需要设置每个控件的最小宽度和最小高度。如下图
在这里插入图片描述


3.界面最大化时控件随之缩放

在这里插入图片描述
在完成布局以后,点击这个按钮(layout in grid)就可以达到这个目的。
如果觉得(layout in grid)之后的界面四周边距太窄,可以通过如图所示的参数调整
在这里插入图片描述


4.最简单的main函数

from PyQt5 import QtWidgets   #这里我的ui文件生成的python文件名为ui.py,因此使用ui
import ui
import sys

class MyWindow(QtWidgets.QMainWindow, ui.Ui_MainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.setupUi(self)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myshow = MyWindow()
    myshow.show()
    sys.exit(app.exec_())

这段代码是执行图形界面的最简单的程序,运行这段代码就可以运行编辑好的ui界面。但是这之前需要对.ui文件执行pyuic生成.py文件。


5.设置菜单栏的槽函数

为了实现点击菜单栏的某个菜单,然后执行对应的动作,就需要为其设置槽函数。
在这里插入图片描述
如上图所示,从上至下依次执行圈住的三个步骤。点击edit以后在slot一栏里添加槽函数open_file。我这里是为了到时候点击file,能够自动执行槽函数open_file()。
添加完毕以后点击cancel就可以。
然后在designer的右下角会有如图所示的信号/槽编辑。sender是发送器,点击可以选择你想要发送信号的控件;signal是信号类型;receiver是接收器,slot是对应的槽函数,这里我们选择之前编辑好的open_file
在这里插入图片描述
之后保存ui文件,重新执行pyuic。
在主函数里编辑对应的open_file()函数。


6.打开文件对话框

提示:
from PyQt5.QtWidgets import QFileDialog
filename, _ = QFileDialog.getOpenFileName(self, ‘Open file’, ‘./’)
详细内容可依此进行百度。


7.在mainwindow里调用另一个widget窗口

同理先制作好另一个widget窗口,并进行pyuic得到py文件。
为这个widget窗口写个类,类似于上述简单的main函数,并把这个类的声明和main函数放在一起

from PyQt5 import QtWidgets   #这里我的ui文件生成的python文件名为ui.py,因此使用ui
import ui
import ui2
import sys

class widget1(QtWidgets.QMainWindow, Ui_Widgets):
    def __init__(self):
        super(widget1, self).__init__()
        self.setupUi(self)
        
class MyWindow(QtWidgets.QMainWindow, ui.Ui_MainWindow):   #主窗口
    def __init__(self):
        super(MyWindow, self).__init__()
        self.setupUi(self)

	def slot(self):              # 这个函数是某个槽函数,比如某个按钮的槽函数,点击按钮打开新的widget窗口
		self.child1  = widget1()   #这里必须使用self,否则槽函数执行完毕以后窗口就关掉了
		self.child1.show()        #注意括号里没有self

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myshow = MyWindow()
    myshow.show()
    sys.exit(app.exec_())

7.使用Qgraphicsview显示图像

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import cv2

srcImage = cv2.imread(str(filename))
self.Mat_dict['srcImage'] = srcImage
img = cv2.cvtColor(srcImage, cv2.COLOR_BGR2RGB)
        y, x, dim = img.shape  # 获取图像大小
        if dim == 4:
            frame = QImage(img, x, y, x * 4, QImage.Format_RGB32)
        elif dim == 3:
            frame = QImage(img, x, y, x * 3, QImage.Format_RGB888)
        elif dim == 1:
            frame = QImage(img, x, y, x * 1, QImage.Format_Grayscale8)
        else:
            raise Exception("image channels must be 1,3,4")
pix = QPixmap.fromImage(frame)
item = QGraphicsPixmapItem(pix)  # 创建像素图元
scene = QGraphicsScene()  # 创建场景
scene.addItem(item)
self.graphicsView.setScene(scene)

更详细的介绍在https://www.cnblogs.com/cy568searchx/p/3502242.html
这里有很重要的一部分就是对于不同的通道数,使用不同的参数讲cv类型的数据转换成QImage类型的数据


8.多个文件可以共用的全局变量

https://www.cnblogs.com/rnckty/p/7722603.html

9.在两个窗口之间传递信号并处触发槽函数

比如在子窗口中点击按钮,希望在主窗口中执行对应的函数

from PyQt5.QtCore import *
class subwindow(Qmainwindow, ui_subwindow):
	mysignal = pyqtSignal(int)
	
	def _init_(self):
		pass

	def func(self):
		self.mysignal.emit(0)      #发射信号

class mywindow(Qmainwindow, ui_subwindow):
	...
	def slot(self):              # 这个函数是某个槽函数,比如某个按钮的槽函数,点击按钮打开新的widget窗口
		self.child1  = subwindow()   #这里必须使用self,否则槽函数执行完毕以后窗口就关掉了
		self.child1.connect(self.myslot)
		self.child1.show()        #注意括号里没有self

	def myslot(self, var):
		pass
  • 在子窗口的类声明中自定义信号,并在类的成员函数中发射信号(emit)
  • 发射信号时传递的值可以是很多类型,可以是str、int、list、object、float、tuple、dict等等。要传递什么只需要在信号声明时指定,还可以传递多个值,比如mysignal=pyqtSignal(int, int, int)
  • 在主窗口的用于显示子窗口的类成员函数中接受信号 (connect),其参数为槽函数(注意槽函数的函数签名需要和发射信号时的函数签名相同)
  • 参考 https://www.jianshu.com/p/60561380f789
  • 参考 https://www.jb51.net/article/134071.htm

10.在listView显示文字

listView是一个实例

 slm = QStringListModel();           # 创建mode
 content = ['ss','aa','ff']     # 添加的数组数据
 slm.setStringList(content)       # 将数据设置到model
 self.listView.setModel(slm)         # 绑定 listView 和 model

11.label显示字符串

self.label.setText


12.listView的槽函数

在这里插入图片描述
def display_choice_2(self, qModelIndex): # listView_2单击的槽函数
print(qModelIndex.row) #当前点击选中的行数


13.ListWidget显示list,以及其他用法

self.listWidget.addItems(list)
注意addItems会在原有的基础上添加,必要时需要用clear进行删除。
使用selectedIndexes()获取当前选择的行数
注意selectedIndexes()得到的是qModelIndex对象,使用qModelIndex.row()获取索引值
使用self.listWidget.currentRow()获取当前的行次序,返回int类型,如果点击空白处返回-1
https://www.cnblogs.com/ygzhaof/p/10077658.html


14.QCombox的使用

currentText()获得文本
currentIndex()获得下标
self.comboBox.currentIndexChanged.connect() comboBox的事件选中函数
self.comboBox.highlight.connect() comboBox的事件选中函数(高亮)


15.坑

  • 不要再初始化函数里创建类的成员变量

16.在listWidget中修改item的内容,并且修改以后获取修改以后的结果

  • 主要实现的功能是:双击item,然后修改内容,修改完成后回车,显示修改后的item的内容。
    在这里插入图片描述
    如图,分别设置两个信号,为itemDoubleClicked和itemChanged可以实现双击item做出相应和修改后回车作出响应。并分别设置这两个信号的槽函数为test1()和test2()
    def test1(self):
        row = self.listWidget.currentRow()    # 获取当前选中的行数
        item = self.listWidget.item(row)        # 获取当前选中的item
        item.setFlags(Qt.ItemIsEditable | Qt.ItemIsEnabled)     # 将item设置为可以编辑的状态

    def test2(self):
        row = self.listWidget.currentRow()  
        item = self.listWidget.item(row)
        print(item.text())      # 显示修改后item的内容

17.在指定控件上创建右键菜单

  • 在Qt designer中的指定控件上单击,可以看到空间的相关属性
    在这里插入图片描述
  • 如图所示,我想要实现在listWidget上右键单击出现菜单,就修改listWidget属性中的contexMenuPolicy,修改为CustomContexMenu。然后如下图所示设置信号和槽函数。
    在这里插入图片描述
  • 红线标出的信号就是右键单击发出的信号。然后在程序中编写槽函数rightClick1()的内容。我们在rightClick1()中创建了Menu菜单,并创建菜单中的delete菜单栏和copy菜单栏。使用self.action1.triggered.connect(self.action_delete_1) 实现单击delete菜单栏执行action_delete_1槽函数。
  • 相关代码如下所示
    def action_delete_1(self):
        row = self.listWidget.currentRow()
        if row > -1
            gl.delete_Mat(self.content[row])
            self.display_inListWidget()  # 刷新显示

    
    def action_copy_1(self):
        pass


    def rightClick1(self):
        self.popMenu = QMenu()
        self.action1 = QAction('delete', self)
        self.action2 = QAction('copy', self)
        self.popMenu.addAction(self.action1)
        self.popMenu.addAction(self.action2)
        self.action1.triggered.connect(self.action_delete_1)    # 注意不能使用trigger,因为trigger不是信号
        self.action1.triggered.connect(self.action_copy_1)    # 注意不能使用trigger,因为trigger不是信号
        self.popMenu.show()
        self.popMenu.exec_(QtGui.QCursor.pos())
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值