飞道的博客

《快速掌握PyQt5》技巧篇

552人阅读  评论(0)

技巧篇

在这里笔者会放上各种各样的PyQt5小技巧,方便快速查阅。大家可以直接用Ctrl+F来进行搜索(Mac上为Command+F)。

 

拖曳无边框窗口


  
  1. import sys
  2. from PyQt5.QtCore import Qt
  3. from PyQt5.QtWidgets import QApplication, QWidget
  4. class Demo(QWidget):
  5. def __init__(self):
  6. super(Demo, self).__init__()
  7. self.setWindowFlag(Qt.FramelessWindowHint) # 1
  8. def mousePressEvent(self, event): # 2
  9. self.start_x = event.x()
  10. self.start_y = event.y()
  11. def mouseMoveEvent(self, event): # 3
  12. dis_x = event.x() - self.start_x
  13. dis_y = event.y() - self.start_y
  14. self.move(self.x()+dis_x, self.y()+dis_y)
  15. if __name__ == '__main__':
  16. app = QApplication(sys.argv)
  17. demo = Demo()
  18. demo.show()
  19. sys.exit(app.exec_())

1. 调用窗口的setWindowFlag方法并传入Qt.FramelessWindowHint即可取消窗口边框。

2. 获取鼠标按下时的坐标位置(相对于窗口左上角)。

3. 当鼠标处于按下状态并开始移动时,鼠标离窗口左上角的位置会不断更新并保存在event.x()和event.y()中。我们将更新后的x和y值不断减去鼠标按下时的坐标位置,就可以知道鼠标移动的距离。最后再调用move方法将窗口当前坐标加上移动距离即可。

 

动态增加和删除控件


  
  1. import sys
  2. from PyQt5.QtCore import Qt
  3. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout, QHBoxLayout
  4. class Demo(QWidget):
  5. def __init__(self):
  6. super(Demo, self).__init__()
  7. self.label_list = [] # 1
  8. for i in range( 5):
  9. label = QLabel(str(i+ 1))
  10. label.setAlignment(Qt.AlignCenter)
  11. self.label_list.append(label)
  12. self.add_btn = QPushButton( '增加文本') # 2
  13. self.minus_btn = QPushButton( '删除文本')
  14. self.add_btn.clicked.connect(self.add_slot)
  15. self.minus_btn.clicked.connect(self.minus_slot)
  16. self.v_layout = QVBoxLayout() # 3
  17. h_layout = QHBoxLayout()
  18. all_v_layout = QVBoxLayout()
  19. for l in self.label_list:
  20. self.v_layout.addWidget(l)
  21. h_layout.addWidget(self.add_btn)
  22. h_layout.addWidget(self.minus_btn)
  23. all_v_layout.addLayout(self.v_layout)
  24. all_v_layout.addLayout(h_layout)
  25. self.setLayout(all_v_layout)
  26. def add_slot(self): # 4
  27. label = QLabel(str(len(self.label_list)+ 1))
  28. label.setAlignment(Qt.AlignCenter)
  29. self.label_list.append(label)
  30. self.v_layout.addWidget(label)
  31. def minus_slot(self): # 5
  32. if len(self.label_list) == 1:
  33. return
  34. label = self.label_list.pop()
  35. label.deleteLater()
  36. if __name__ == '__main__':
  37. app = QApplication(sys.argv)
  38. demo = Demo()
  39. demo.show()
  40. sys.exit(app.exec_())

1. 首先实例化五个QLabel控件,并添加到self.label_list列表中,动态增删的关键其实就是这个列表。

2. 实例化两个按钮分别用于增加和删除QLabel控件。

3. self.v_layout垂直布局管理器用于布局各个QLabel控件,h_layout管理器用于摆放两个按钮,而all_v_layout用于总体布局。这里之所以要将v_layout作为成员变量是因为我们在增加QLabel控件时需要使用到。

4. add_slot槽函数用于增加QLabel控件,每实例化一个QLabel,我们就将其添加到self.label_list列表和self.v_layout布局管理器中。

5. minus_slot槽函数用于删除末尾的QLabel控件。如果控件数量只剩一个,那么就不允许删除,否则调用列表的pop()方法获取到最后一个QLabel控件,然后调用deleteLater()方法删除即可。

 

PS:

在动态增删控件时如果想要自动调整窗口大小,我们可以添加以下代码:


  
  1. from PyQt5.QtWidgets import QLayout
  2. all_v_layout.setSizeConstraint(QLayout.SetFixedSize)

 

QTableWidget单元格文本居中


  
  1. import sys
  2. from PyQt5.QtCore import Qt
  3. from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QHeaderView, \
  4. QPushButton, QVBoxLayout
  5. class Demo(QWidget):
  6. def __init__(self):
  7. super(Demo, self).__init__()
  8. self.resize( 500, 300)
  9. self.table = QTableWidget() # 1
  10. self.set_table_properties()
  11. self.btn = QPushButton( '文本居中') # 2
  12. self.btn.clicked.connect(self.center_slot)
  13. v_layout = QVBoxLayout()
  14. v_layout.addWidget(self.table)
  15. v_layout.addWidget(self.btn)
  16. self.setLayout(v_layout)
  17. def set_table_properties(self):
  18. """设置表格属性"""
  19. self.table.setColumnCount( 3)
  20. self.table.setRowCount( 6)
  21. self.table.setHorizontalHeaderLabels([ '标题1', '标题2', '标题3'])
  22. self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
  23. self.table.verticalHeader().setHidden( True)
  24. for row in range(self.table.rowCount()):
  25. for col in range(self.table.columnCount()):
  26. self.table.setItem(row, col, QTableWidgetItem( f'({row}, {col})'))
  27. def center_slot(self):
  28. """文本居中槽函数"""
  29. for row in range(self.table.rowCount()):
  30. for col in range(self.table.columnCount()):
  31. self.table.item(row, col).setTextAlignment(Qt.AlignCenter)
  32. if __name__ == '__main__':
  33. app = QApplication(sys.argv)
  34. demo = Demo()
  35. demo.show()
  36. sys.exit(app.exec_())

1. 实例化一个表格控件,然后在set_table_property函数中笔者设置了表格的相关属性:

  • 设置表格列数和行数为3和6
  • 设置表格标题字段名称为'标题1',‘标题2’,‘标题3’
  • 拉伸各列,使表格填充窗口
  •  将表格左边自带的序列号隐藏
  • 设置各个单元格内容

2. 点击按钮后可以让文本居中。在center_slot槽函数中循环各个单元格,然后对每个单元格调用setTextAlignment方法并传入Qt.AlignCenter即可。

 

在线程中获取窗口控件内容


  
  1. import sys
  2. from PyQt5.QtCore import QThread
  3. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel, QVBoxLayout, QHBoxLayout
  4. class Demo(QWidget):
  5. def __init__(self):
  6. super(Demo, self).__init__()
  7. self.line = QLineEdit()
  8. self.btn = QPushButton( '开始爬取')
  9. self.btn.clicked.connect(self.start_slot)
  10. h_layout = QHBoxLayout()
  11. v_layout = QVBoxLayout()
  12. h_layout.addWidget(QLabel( '网址:'))
  13. h_layout.addWidget(self.line)
  14. v_layout.addLayout(h_layout)
  15. v_layout.addWidget(self.btn)
  16. self.setLayout(v_layout)
  17. self.crawl_thread = CrawlThread(self) # 1
  18. def start_slot(self): # 2
  19. self.crawl_thread.start()
  20. class CrawlThread(QThread):
  21. def __init__(self, demo): # 3
  22. super(CrawlThread, self).__init__()
  23. self.demo = demo
  24. def run(self): # 4
  25. url = self.demo.line.text().strip()
  26. print( f'要爬取的网址为:{url}')
  27. if __name__ == '__main__':
  28. app = QApplication(sys.argv)
  29. demo = Demo()
  30. demo.show()
  31. sys.exit(app.exec_())

1. 实例化线程,注意此时我们需要把当前窗口类实例(也就是self)传入。

2. 按钮所连接的槽函数用来启动线程。

3. 给线程的初始化函数添加一个参数,用来获取窗口类实例。

4. 接着我们就可以在run函数中获取窗口上任何一个控件及其内容了。

 

待更新

如果大家有想要了解的小技巧,可以在评论区留言。


转载:https://blog.csdn.net/La_vie_est_belle/article/details/105572988
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场