pyside6(2):QPrincipalVentana

1. Componentes del contenedor

El componente contenedor se utiliza para alojar todos los componentes visibles de la interfaz de usuario . El componente contenedor es una ventana que aparece durante el tiempo de ejecución, generalmente una de las clases QWindow , QWidget o QDialog  . Para conocer la diferencia entre los tres, consulte: Diferencia entre QWidget, QMainWindow y QDialog_Nothing-Anything-CSDN Blog_Diferencia entre qwidget y qdialog

Si es un cuadro de diálogo de nivel superior, generalmente se crea en base a QDialog . Si es un formulario principal, se basa en QMainWindow . Si no está seguro, o puede ser un formulario de nivel superior, o puede ser incrustado en otras formas, se crea en base a QWidget .

2.QVentanaPrincipal

La ventana principal del software de escritorio generalmente se compone de barra de título, barra de menú, barra de herramientas, área de trabajo y barra de estado .

../../_images/mainwindowlayout.png

El espacio de trabajo se compone de varios controles de anclaje, como la ventana principal de Pycharm :

Puede ver que el espacio de trabajo de la ventana principal de Pycharm tiene tres controles de anclaje de forma predeterminada, a saber, el explorador de archivos, la ventana de depuración y el editor de código. QMainWindow proporciona los componentes necesarios para construir una ventana principal clásica y los eventos de mouse correspondientes para simplificar la construcción de la ventana principal de la aplicación. La configuración común de QMainWindow es la siguiente. Para obtener más información, consulte: QMainWindow — Qt para Python

3. Configuración de la barra de título

class MyWidget(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # 设置标题
        self.setWindowTitle("QMainWindow示例")
        # 设置图标
        self.setWindowIcon(QPixmap(":/icon/ic_start"))

if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

pista

Para QPixmap(":/icon/ic_start") en el código , consulte pyside6(1): Qt resource system and qrc file use_anbuqi's blog-CSDN blog

4. Configuración de la barra de menú (QMenuBar)

4.1 Configuración básica de la barra de menú

QMainWindow agrega una barra de menú por defecto , que se puede obtener a través de self.menuBar() . Agregar un elemento de menú a la barra de menú

fileMenu = self.menuBar().addMenu(QPixmap(":/icon/ic_start"),"文件")

Cuando se pasa un objeto de icono como parámetro, solo se muestra el icono del elemento de menú de forma predeterminada y no se muestra el nombre del elemento de menú:

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        # 菜单栏设置
        self.setupMenuBar()
    
     def setupMenuBar(self):
        # 添加文件菜单项
        fileMenu = self.menuBar().addMenu(QPixmap(":/icon/ic_start"),"文件")
        # 文件菜单项下的动作列表
        newAct = QAction(QPixmap(":/icon/ic_start"), "新建", self)
        fileMenu.addAction(newAct)

        saveAct = QAction(QPixmap(":/icon/ic_start"), "保存", self)
        fileMenu.addAction(saveAct)

        exitAct = QAction(QPixmap(":/icon/ic_start"), "退出", self)
        fileMenu.addAction(exitAct)
        
        # 自定义快捷键
        exitAct.setShortcut('Ctrl+Q')
        # 状态栏提示
        exitAct.setStatusTip('Exit application')
        # 利用信号槽机制,将退出动作和窗口的关闭函数联系起来
        exitAct.triggered.connect(self.close)

if __name__ == "__main__":
    ......

Efecto

 Aviso

Al crear una QAction , se debe pasar el self del objeto de la ventana ; de lo contrario, la QAction no se mostrará.

 4.2 Personalizar la barra de menú

 Se puede implementar una barra de menú personalizada a través de setMenuWidget de QMainWindow :

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupTitleBar()

        self.setupCustomMenuBar()
       
    def setupCustomMenuBar(self):
        menuBar = QWidget()
        layout = QGridLayout()
        fileBtn = QPushButton("文件")
        layout.addWidget(fileBtn, 0, 0)
        editBtn = QPushButton("编辑")
        layout.addWidget(editBtn, 0, 1)
        helpBtn = QPushButton("帮助")
        layout.addWidget(helpBtn, 0, 2)
        menuBar.setLayout(layout)
        self.setMenuWidget(menuBar)


if __name__ == "__main__":
    ......

 De esta forma, se puede personalizar una barra de menú personalizada, como la barra de menú del Diccionario Youdao:

5. Configuración de la barra de estado (Q StatusBar )

La barra de estado se usa para mostrar mensajes de estado de la interfaz actual o algunas indicaciones. La barra de estado puede mostrar los siguientes tres mensajes:

  • Mensajes temporales : se utilizan para explicar el texto de información sobre herramientas o las entradas del menú.
  • Mensajes normales : Ocupa parte de la barra de estado y puede estar tapado por mensajes temporales. Por ejemplo, números de página y línea que se muestran en un editor de texto.
  • Mensajes persistentes : se utiliza para mostrar mensajes importantes, como errores de sintaxis en el editor de código.

QMaindow crea una QStatusBar de forma predeterminada, que se puede obtener a través de self.statusBar() .

5.1 Mostrar mensajes temporales

No desaparecerá automáticamente hasta que se sobrescriba:

self.statusBar().showMessage("临时消息")

El tiempo desaparece:

self.statusBar().showMessage("临时消息定时消失", 3000)

Aviso

Los mensajes temporales se superponen entre sí , llamar  a showMessage continuamente solo mostrará el último mensaje temporal establecido. Por ejemplo:

        # 显示临时消息
        self.statusBar().showMessage("临时消息")
        # 显示临时消息,定时消失
        self.statusBar().showMessage("临时消息定时消失", 3000)

Solo se mostrará el mensaje " El mensaje temporal desaparece periódicamente ".

5.2 Mostrar mensajes normales

Los mensajes normales deben agregarse llamando al método addWidget de statusBar :

normalMessage = QLabel("正常消息")
# 组件名称
normalMessage.setObjectName('normalMessage')
self.statusBar().addWidget(normalMessage)
btn = QPushButton("消息按钮")
# 组件名称
btn.setObjectName('btn')
self.statusBar().addWidget(btn)

 Use removeWidget para eliminar mensajes normales: 

self.statusBar().removeWidget(self.statusBar().findChild(QLabel, 'normalMessage'))
self.statusBar().removeWidget(self.statusBar().findChild(QPushButton, 'normalBtn'))

5.3 Mostrar mensajes permanentes

permanentMessage = QLabel("永久消息")
# 组件名称
permanentMessage.setObjectName('permanentMessage')
self.statusBar().addPermanentWidget(permanentMessage)

permanentBtn = QPushButton("永久消息按钮")
# 组件名称
permanentBtn.setObjectName('permanentBtn')
self.statusBar().addPermanentWidget(permanentBtn)

  Los mensajes persistentes también se eliminan mediante removeWidget .

(4) demostración

import sys

from PySide6 import QtWidgets
from PySide6.QtGui import QPixmap, QAction
from PySide6.QtWidgets import QVBoxLayout, QMainWindow, QWidget, QGridLayout, QPushButton, QLabel

import res


class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        centerWidget = QWidget()
        mainLayout = QGridLayout()

        showTemMessageBtn = QPushButton("显示一般临时消息")
        showTemMessageBtn.clicked.connect(self.showTempMessage)
        mainLayout.addWidget(showTemMessageBtn, 0, 0)

        showTemMessageBtn2 = QPushButton("显示定时消失临时消息")
        showTemMessageBtn2.clicked.connect(self.showTimingTemMessage)
        mainLayout.addWidget(showTemMessageBtn2, 0, 1)

        showNormalMessageBtn = QPushButton("显示正常消息")
        showNormalMessageBtn.clicked.connect(self.showNormalMessage)
        mainLayout.addWidget(showNormalMessageBtn, 0, 2)

        shoPermanentBtn = QPushButton("显示永久消息")
        shoPermanentBtn.clicked.connect(self.showPermanentMessage)
        mainLayout.addWidget(shoPermanentBtn, 0, 3)

        clearNormalMessage = QPushButton("移除正常消息")
        clearNormalMessage.clicked.connect(self.removeNormalMessage)
        mainLayout.addWidget(clearNormalMessage, 1, 0)

        clearPermanentMessage = QPushButton("移除永久消息")
        clearPermanentMessage.clicked.connect(self.removePermanentMessage)
        mainLayout.addWidget(clearPermanentMessage, 1, 1)

        centerWidget.setLayout(mainLayout)
        self.setCentralWidget(centerWidget)

    def removeNormalMessage(self):
        self.statusBar().removeWidget(self.statusBar().findChild(QLabel, 'normalMessage'))
        self.statusBar().removeWidget(self.statusBar().findChild(QPushButton, 'normalBtn'))

    def removePermanentMessage(self):
        self.statusBar().removeWidget(self.statusBar().findChild(QLabel, 'permanentMessage'))
        self.statusBar().removeWidget(self.statusBar().findChild(QPushButton, 'permanentBtn'))

    def showTempMessage(self):
        self.statusBar().showMessage("临时消息")

    def showTimingTemMessage(self):
        self.statusBar().showMessage("临时消息定时消失", 1000)

    def showNormalMessage(self):
        normalMessage = QLabel("正常消息")
        # 组件名称
        normalMessage.setObjectName('normalMessage')
        self.statusBar().addWidget(normalMessage)
        btn = QPushButton("正常消息按钮")
        # 组件名称
        btn.setObjectName('normalBtn')
        self.statusBar().addWidget(btn)

    def showPermanentMessage(self):
        permanentMessage = QLabel("永久消息")
        # 组件名称
        permanentMessage.setObjectName('permanentMessage')
        self.statusBar().addPermanentWidget(permanentMessage)

        permanentBtn = QPushButton("永久消息按钮")
        # 组件名称
        permanentBtn.setObjectName('permanentBtn')
        self.statusBar().addPermanentWidget(permanentBtn)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

6. Arrastra y suelta componentes acoplables (QDockWidget)

El dockWidget se puede acoplar en el área circundante alrededor del control central de la ventana principal:

 El valor opcional de la posición de acoplamiento está definido por la clase DockWidgetArea. Hay cuatro posiciones de acoplamiento: arriba, abajo, izquierda y derecha. Se pueden seleccionar varios valores a la vez, por ejemplo:

import sys

from PySide6 import QtWidgets
from PySide6.QtGui import QPixmap, QAction, Qt
from PySide6.QtWidgets import QMainWindow, QWidget, QGridLayout, QPushButton, QLabel, QDockWidget
import sys

from PySide6 import QtWidgets
from PySide6.QtGui import QPixmap, QAction, Qt
from PySide6.QtWidgets import QMainWindow, QWidget, QGridLayout, QPushButton, QLabel, QDockWidget


class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        # 往主窗口添加停靠窗口
        dockWidget = QDockWidget("Dock Widget", self)
        # 设置可停靠位置为左和右
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea |
                                   Qt.RightDockWidgetArea)
       
        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())


class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        # 往主窗口添加停靠窗口
        dockWidget = QDockWidget("Dock Widget", self)
        # 设置可停靠位置为左和右
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea |
                                   Qt.RightDockWidgetArea)
       
        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

 Efecto:

Supongo que te gusta

Origin blog.csdn.net/anbuqi/article/details/120468791
Recomendado
Clasificación