真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么自定義實(shí)現(xiàn)PyQt5下拉復(fù)選框ComboCheckBox-創(chuàng)新互聯(lián)

小編給大家分享一下怎么自定義實(shí)現(xiàn)PyQt5下拉復(fù)選框ComboCheckBox,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)新鄉(xiāng)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

自定義實(shí)現(xiàn) PyQt5 下拉復(fù)選框 ComboCheckBox

一、前言

由于最近的項(xiàng)目需要具有復(fù)選功能,但過多的復(fù)選框會(huì)影響界面布局和美觀,因而想到把 PyQt5 的下拉列表和復(fù)選框結(jié)合起來,但在 PyQt5 中并沒有這樣的組件供我們使用,所以想要自己實(shí)現(xiàn)一個(gè)下拉復(fù)選框,主要就是繼承 QComboBox 類,然后將復(fù)選框 QCheckBox 加入其中,并實(shí)現(xiàn)相應(yīng)的功能。

最終實(shí)現(xiàn)的下拉復(fù)選框效果如下:

怎么自定義實(shí)現(xiàn)PyQt5下拉復(fù)選框ComboCheckBox

二、代碼實(shí)現(xiàn)

1.主要方法

在 PyQt5 中,有幾個(gè)主要的方法需要了解一下,方法名稱和對應(yīng)的含義如下:

QtWidgets.QComboBox.setView( itemView ) :設(shè)置 組合框彈出窗口中使用的視圖 , 組合框獲取視圖的所有權(quán)。
QtWidgets.QcomboBox.setLineEdit( QLineEdit ) : 設(shè)置組合框 使用 的行 ,而不是當(dāng)前行編輯窗口小部件。
QtWidgets.QListWidget.setItemWidget(item, widget) : 設(shè)置 要在給定的 item 中的 widget 組件 。

2.具體代碼

實(shí)現(xiàn)下拉復(fù)選框的思路為用 setView() 方法將 QComboBox 下拉列表的視圖改為 QListWidget 組件,然后將 QCheckBox 復(fù)選框用在 QListWiget 中,具體代碼如下:

class ComboCheckBox(QComboBox):
  def __init__(self, items: list):
    """
    initial function
    :param items: the items of the list
    """
    super(ComboCheckBox, self).__init__()
    self.items = items # items list
    self.box_list = [] # selected items
    self.text = QLineEdit() # use to selected items
    self.text.setReadOnly(True)
    q = QListWidget()
    for i in range(len(self.items)):
      self.box_list.append(QCheckBox())
      self.box_list[i].setText(self.items[i])
      item = QListWidgetItem(q)
      q.setItemWidget(item, self.box_list[i])
      self.box_list[i].stateChanged.connect(self.show_selected)
    self.setLineEdit(self.text)
    self.setModel(q.model())
    self.setView(q)
  def get_selected(self) -> list:
    """
    get selected items
    :return:
    """
    ret = []
    for i in range(len(self.items)):
      if self.box_list[i].isChecked():
        ret.append(self.box_list[i].text())
    return ret
  def show_selected(self):
    """
    show selected items
    :return:
    """
    self.text.clear()
    ret = '; '.join(self.get_selected())
    self.text.setText(ret)

其中 show_selected() 用于顯示被選中的內(nèi)容,get_selected() 則用于獲取所有被選中的內(nèi)容并返回。

3.增加全選

要增加全選功能,首先是要在最前面加一個(gè)全選的選擇框,然后為這個(gè)全選的選擇框綁定相應(yīng)的方法,用于實(shí)現(xiàn)全選功能和取消全選功能,具體代碼如下:

def all_selected(self):
  """
  decide whether to check all
  :return:
  """
  # change state
  if self.state == 0:
    self.state = 1
    for i in range(1, len(self.items)):
      self.box_list[i].setChecked(True)
  else:
    self.state = 0
    for i in range(1, len(self.items)):
      self.box_list[i].setChecked(False)
  self.show_selected()

4.修改樣式

由于默認(rèn)的樣式并不美觀,所以我們可以對控件的樣式進(jìn)行自定義,例如字體大小、字體粗細(xì)等等,例如:

q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px") self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold")

三、完整程序

完善后的下拉復(fù)選框的運(yùn)行程序代碼如下:

from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidgetItem, QListWidget, QCheckBox, \
  QApplication, QVBoxLayout, QWidget
import sys
class ComboCheckBox(QComboBox):
  def __init__(self, items: list):
    """
    initial function
    :param items: the items of the list
    """
    super(ComboCheckBox, self).__init__()
    self.items = ["全選"] + items # items list
    self.box_list = [] # selected items
    self.text = QLineEdit() # use to selected items
    self.state = 0 # use to record state
    q = QListWidget()
    for i in range(len(self.items)):
      self.box_list.append(QCheckBox())
      self.box_list[i].setText(self.items[i])
      item = QListWidgetItem(q)
      q.setItemWidget(item, self.box_list[i])
      if i == 0:
        self.box_list[i].stateChanged.connect(self.all_selected)
      else:
        self.box_list[i].stateChanged.connect(self.show_selected)
    q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px")
    self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold")
    self.text.setReadOnly(True)
    self.setLineEdit(self.text)
    self.setModel(q.model())
    self.setView(q)
  def all_selected(self):
    """
    decide whether to check all
    :return:
    """
    # change state
    if self.state == 0:
      self.state = 1
      for i in range(1, len(self.items)):
        self.box_list[i].setChecked(True)
    else:
      self.state = 0
      for i in range(1, len(self.items)):
        self.box_list[i].setChecked(False)
    self.show_selected()
  def get_selected(self) -> list:
    """
    get selected items
    :return:
    """
    ret = []
    for i in range(1, len(self.items)):
      if self.box_list[i].isChecked():
        ret.append(self.box_list[i].text())
    return ret
  def show_selected(self):
    """
    show selected items
    :return:
    """
    self.text.clear()
    ret = '; '.join(self.get_selected())
    self.text.setText(ret)
class UiMainWindow(QWidget):
  def __init__(self):
    super(UiMainWindow, self).__init__()
    self.setWindowTitle('Test')
    self.resize(600, 400)
    combo = ComboCheckBox(["Python", "Java", "Go", "C++", "JavaScript", "PHP"])
    layout = QVBoxLayout()
    layout.addWidget(combo)
    self.setLayout(layout)
if __name__ == "__main__":
  app = QApplication(sys.argv)
  ui = UiMainWindow()
  ui.show()
  sys.exit(app.exec_())

以上是“怎么自定義實(shí)現(xiàn)PyQt5下拉復(fù)選框ComboCheckBox”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享名稱:怎么自定義實(shí)現(xiàn)PyQt5下拉復(fù)選框ComboCheckBox-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://weahome.cn/article/eoegj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部