【使用PyQt创建美观和功能丰富界面】

使用PyQt创建美观和功能丰富界面-适用于APP

  • 一、基本概念与环境搭建
  • 二、布局管理
  • 三、部件使用与定制
  • 四、信号与槽机制深入应用
  • 五、样式表(stylesheet)和主题应用

一、基本概念与环境搭建

  1. 安装PyQt
    • 使用以下命令安装PyQt:pip install PyQt5(如果使用Python 3)。
  2. 理解信号与槽机制
    • 信号(Signal):是对象发出的事件通知,例如按钮的点击、文本框内容的改变等。
    • 槽(Slot):是接收到信号后执行的函数。通过将信号与槽连接,可以实现交互逻辑。例如,当按钮被点击(发出clicked信号)时,执行一个函数(槽)来处理点击事件。

二、布局管理

  1. QVBoxLayout(垂直布局)和QHBoxLayout(水平布局)
    • QVBoxLayout示例
      • 创建一个垂直排列部件的布局。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
      app = QApplication(sys.argv)
      window = QWidget()
      layout = QVBoxLayout()
      button1 = QPushButton("按钮1")
      button2 = QPushButton("按钮2")
      layout.addWidget(button1)
      layout.addWidget(button2)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • QHBoxLayout示例
      • 创建一个水平排列部件的布局。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton
      app = QApplication(sys.argv)
      window = QWidget()
      layout = QHBoxLayout()
      button1 = QPushButton("按钮1")
      button2 = QPushButton("按钮2")
      layout.addWidget(button1)
      layout.addWidget(button2)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  2. QGridLayout(网格布局)
    • 用于将部件以表格形式排列。
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, QLineEdit
    app = QApplication(sys.argv)
    window = QWidget()
    layout = QGridLayout()
    username_label = QLabel("用户名:")
    password_label = QLabel("密码:")
    username_edit = QLineEdit()
    password_edit = QLineEdit()
    layout.addWidget(username_label, 0, 0)
    layout.addWidget(username_edit, 0, 1)
    layout.addWidget(password_label, 1, 0)
    layout.addWidget(password_edit, 1, 1)
    window.setLayout(layout)
    window.show()
    sys.exit(app.exec_())
    
  3. QFormLayout(表单布局)
    • 特别适合用于创建表单,自动将标签和输入部件对齐。
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLabel, QLineEdit
    app = QApplication(sys.argv)
    window = QWidget()
    layout = QFormLayout()
    name_label = QLabel("姓名")
    name_edit = QLineEdit()
    age_label = QLabel("年龄")
    age_edit = QLineEdit()
    layout.addRow(name_label, name_edit)
    layout.addRow(age_label, age_edit)
    window.setLayout(layout)
    window.show()
    sys.exit(app.exec_())
    
  4. 嵌套布局
    • 可以将不同的布局组合使用,以实现更复杂的界面结构。
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton
    app = QApplication(sys.argv)
    window = QWidget()
    main_layout = QVBoxLayout()
    top_layout = QHBoxLayout()
    bottom_layout = QHBoxLayout()
    button1 = QPushButton("按钮1")
    button2 = QPushButton("按钮2")
    button3 = QPushButton("按钮3")
    button4 = QPushButton("按钮4")
    top_layout.addWidget(button1)
    top_layout.addWidget(button2)
    bottom_layout.addWidget(button3)
    bottom_layout.addWidget(button4)
    main_layout.addLayout(top_layout)
    main_layout.addLayout(bottom_layout)
    window.setLayout(main_layout)
    window.show()
    sys.exit(app.exec_())
    

三、部件使用与定制

  1. 按钮(QPushButton)
    • 基本按钮示例
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      app = QApplication(sys.argv)
      window = QWidget()
      button = QPushButton("点击我")
      button.clicked.connect(lambda: print("按钮被点击了"))
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • 按钮样式定制
      • 使用样式表(stylesheet)来改变按钮的外观,如设置背景颜色、字体颜色、边框等。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      app = QApplication(sys.argv)
      window = QWidget()
      button = QPushButton("自定义按钮")
      button.setStyleSheet("QPushButton {background-color: blue; color: white; border - radius: 10px; padding: 10px;}")
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  2. 标签(QLabel)
    • 显示文本的标签示例
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QLabel
      app = QApplication(sys.argv)
      window = QWidget()
      label = QLabel("这是一个标签")
      layout = QVBoxLayout()
      layout.addWidget(label)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • 显示图像的标签示例
      • 需要先导入QPixmap来加载图像。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QLabel
      from PyQt5.QtGui import QPixmap
      app = QApplication(sys.argv)
      window = QWidget()
      label = QLabel()
      pixmap = QPixmap("image.jpg")
      label.setPixmap(pixmap)
      layout = QVBoxLayout()
      layout.addWidget(label)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  3. 输入框(QLineEdit)和文本框(QTextEdit)
    • QLineEdit示例
      • 用于单行文本输入。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
      app = QApplication(sys.argv)
      window = QWidget()
      line_edit = QLineEdit()
      line_edit.setPlaceholderText("请输入内容")
      layout = QVBoxLayout()
      layout.addWidget(line_edit)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • QTextEdit示例
      • 用于多行文本输入和显示。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit
      app = QApplication(sys.argv)
      window = QWidget()
      text_edit = QTextEdit()
      text_edit.setPlainText("这是初始文本")
      layout = QVBoxLayout()
      layout.addWidget(text_edit)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  4. 列表视图(QListView)和列表部件(QListWidget)
    • QListWidget示例
      • 用于展示列表数据。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListWidget
      app = QApplication(sys.argv)
      window = QWidget()
      list_widget = QListWidget()
      list_widget.addItem("项目1")
      list_widget.addItem("项目2")
      layout = QVBoxLayout()
      layout.addWidget(list_widget)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • 自定义列表项外观(简单示例)
      • 通过设置QListWidgetItem的样式来实现。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListWidget, QListWidgetItem
      app = QApplication(sys.argv)
      window = QWidget()
      list_widget = QListWidget()
      item1 = QListWidgetItem("项目1")
      item1.setForeground(Qt.red)  # 设置文本颜色为红色
      list_widget.addItem(item1)
      item2 = QListWidgetItem("项目2")
      item2.setBackground(Qt.yellow)  # 设置背景颜色为黄色
      list_widget.addItem(item2)
      layout = QVBoxLayout()
      layout.addWidget(list_widget)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  5. 表格视图(QTableView)和表格部件(QTableWidget)
    • QTableWidget示例
      • 用于展示表格数据。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem
      app = QApplication(sys.argv)
      window = QWidget()
      table_widget = QTableWidget()
      table_widget.setRowCount(2)
      table_widget.setColumnCount(2)
      table_widget.setItem(0, 0, QTableWidgetItem("数据1"))
      table_widget.setItem(0, 1, QTableWidgetItem("数据2"))
      table_widget.setItem(1, 0, QTableWidgetItem("数据3"))
      table_widget.setItem(1, 1, QTableWidgetItem("数据4"))
      layout = QVBoxLayout()
      layout.addWidget(table_widget)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  6. 树视图(QTreeView)和树部件(QTreeWidget)
    • QTreeWidget示例
      • 用于展示树形结构的数据。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem
      app = QApplication(sys.argv)
      window = QWidget()
      tree_widget = QTreeWidget()
      root_item = QTreeWidgetItem(tree_widget, ["根节点"])
      child_item1 = QTreeWidgetItem(root_item, ["子节点1"])
      child_item2 = QTreeWidgetItem(root_item, ["子节点2"])
      layout = QVBoxLayout()
      layout.addWidget(tree_widget)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      

四、信号与槽机制深入应用

  1. 自定义信号与槽
    • 除了使用部件自带的信号和槽,还可以在自定义类中定义信号和槽来实现更复杂的逻辑。
    import sys
    from PyQt5.QtCore import pyqtSignal
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
    class MyWidget(QWidget):
        my_signal = pyqtSignal(int)
        def __init__(self):
            super().__init__()
            button = QPushButton("发送信号")
            button.clicked.connect(self.send_signal)
            layout = QVBoxLayout()
            layout.addWidget(button)
            self.setLayout(layout)
        def send_signal(self):
            self.my_signal.emit(42)
    def handle_signal(value):
        print("接收到信号,值为:", value)
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.my_signal.connect(handle_signal)
    widget.show()
    sys.exit(app.exec_())
    
  2. 连接多个信号到一个槽或一个信号到多个槽
    • 多个信号连接到一个槽示例
      • 假设有两个按钮,点击任何一个按钮都执行同一个函数。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      def button_clicked():
          print("按钮被点击了")
      app = QApplication(sys.argv)
      window = QWidget()
      button1 = QPushButton("按钮1")
      button2 = QPushButton("按钮2")
      button1.clicked.connect(button_clicked)
      button2.clicked.connect(button_clicked)
      layout = QVBoxLayout()
      layout.addWidget(button1)
      layout.addWidget(button2)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • 一个信号连接到多个槽示例
      • 一个按钮点击后,执行多个函数。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      def function1():
          print("执行函数1")
      def function2():
          print("执行函数2")
      app = QApplication(sys.argv)
      window = QWidget()
      button = QPushButton("点击我")
      button.clicked.connect(function1)
      button.clicked.connect(function2)
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      

五、样式表(stylesheet)和主题应用

  1. 样式表基础应用
    • 可以在部件级别或全局级别设置样式表。
    • 部件级别样式表示例
      • 为一个按钮设置样式。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      app = QApplication(sys.argv)
      window = QWidget()
      button = QPushButton("样式按钮")
      button.setStyleSheet("QPushButton {background - color: green; color: white; font - size: 16px;}")
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • 全局级别样式表示例
      • 设置整个应用程序的样式。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      app = QApplication(sys.argv)
      app.setStyleSheet("QWidget {background - color: lightgray;} QPushButton {color: red;}")
      window = QWidget()
      button = QPushButton("全局样式按钮")
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
  2. 主题应用(使用第三方主题库或自定义主题)
    • 使用第三方主题库(以qdarkstyle为例)
      • 首先安装qdarkstylepip install qdarkstyle
      • 然后在应用中使用。
      import sys
      from PyQt5.QtWidgets import QApplication
      import qdarkstyle
      app = QApplication(sys.argv)
      app.setStyleSheet(qdarkstyle.load_stylesheet())
      window = QWidget()
      button = QPushButton("主题按钮")
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      
    • 自定义主题(简单示例)
      • 通过设置样式表来创建自定义主题。
      import sys
      from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
      app = QApplication(sys.argv)
      custom_theme = """
      QWidget {
          background-color: #f0f0f0;
          color: #333;
      }
      QPushButton {
          background-color: #007bff;
          color: white;
          border - radius: 5px;
          padding: 10px;
      }
      """
      app.setStyleSheet(custom_theme)
      window = QWidget()
      button = QPushButton("自定义主题按钮")
      layout = QVBoxLayout()
      layout.addWidget(button)
      window.setLayout(layout)
      window.show()
      sys.exit(app.exec_())
      

你可能感兴趣的:(pyqt,microsoft,python)