为了账号安全,请及时绑定邮箱和手机立即绑定

实现窗口中对象的对齐,从另一个.py文件添加图形

实现窗口中对象的对齐,从另一个.py文件添加图形

Helenr 2022-09-20 17:51:01
所以,我想问你关于在PyQt5中更好地组织多个,,图。以前,我得到了一些帮助,使用网格来实现我放入的对象更好地对齐。buttonsTextBoxMy Window但是,我试图编码的结局仍然有点远。以下是我到目前为止所得到的:from PyQt5 import QtWidgets, QtCorefrom PyQt5.QtWidgets import *import sysclass Okno(QMainWindow):    def __init__(self):        super(Okno, self).__init__()        self.setGeometry(500, 500, 900, 500)        self.setWindowTitle("My window")        self.button1 = QtWidgets.QPushButton()        self.button2 = QtWidgets.QPushButton()        self.TextBox1 = QLineEdit(self)  # Parameter self - add text box to my Window "Okno"        self.TextBox2 = QLineEdit(self)        self.TextBox3 = QLineEdit(self)        self.TextBox4 = QLineEdit(self)   # Baudrate        self.TextBox5 = QLineEdit(self)   # Parity        self.TB_TEMP_IN = QLineEdit(self)   # Temp_IN        self.TB_TEMP_OUT = QLineEdit(self)   # Temp_OUT        self.label1 = QtWidgets.QLabel()  # TextBox1, pressure_IN        self.label2 = QtWidgets.QLabel()        self.label3 = QtWidgets.QLabel()        self.label4 = QtWidgets.QLabel()  # TextBox3, pressure_OUT        self.label_TEMP_IN = QtWidgets.QLabel()        self.label_TEMP_OUT = QtWidgets.QLabel()        self.iniUI()在添加更多对象时,我注意到的一件事是很难组织起来。如果我正确理解它的工作原理,我必须将网格扩展到10 x 6,但是对齐方式(左,中,右)不会以对齐顺序对对象进行排序,例如由绝对边界定义的行/列。Grid至于按钮,文本框,...我应该能够对它们进行编程,我只是没有太多使用Windows应用程序的经验,而主要是做控制台应用程序。但是,我应该如何将两个图形添加到中?我正在使用matplotlib.pyplot将它们绘制在另一个.py文件中,我使用熊猫从.xls文件加载部分数据,另一部分(数据输出)将通过串行(RS232)或TCP / IP接口接收。我必须实时绘制它们并能够存储它们(.txt或.csv,这并不重要)。My Window您能否给我一些关于选择“我的窗口”的正确概念的提示,以实现我在下面附加的示例,并能够在将来“轻松”添加其他对象(如有必要)。我绝对认为窗口中的对象越多,就越需要更好的组织,因为方法和类都变得很长。iniUI(self)Okno(QMainWindow)我举了一个简单的例子来说明我想要实现的目标:
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

在将微件添加到布局时设置构件的对齐方式不会影响构件的对齐方式,而只会影响它们在布局提供的空间中的对齐方式。此外,许多小部件会自动尝试扩展自己(如 QLabel 或项目视图)。

例如,QLabel具有文本的左/垂直居中的默认对齐方式,因此您需要设置对齐方式,但如果其他小部件允许,它仍将尝试扩展其可用空间。

要获得所需的内容,您必须考虑小部件之间的间距,它们(这表示小部件在布局中使用时对其大小的“意愿”,如果它具有固定的大小,是否可以增长/扩展,是否可以缩小等)。sizePolicy

由于您希望列之间留出一些空间,因此最简单的方法是在布局中保留空列,并使用 setColumnStretch() 在这些列上设置拉伸因子,以便它们尝试尽可能多地扩展。

最后,对于复杂的结构,最好使用嵌套布局,这意味着您将为小部件设置一个主布局,并向其添加“子”布局,以便每个“部分”都有自己的布局管理器,独立于其他布局。在下面的示例中,我实现了如下结构:

  +-------------- main vertical layout ---------------+

    |                                                   |

    |  +------------ button grid layout -------------+  |

    |  |title|    |(empty)|      |(empty)|     |title|  |

    |  +-----+----+-------+------+-------+-----+-----+  |

    |  |label|edit|       |input |       |label|edit |  |

    |  +-----+----+-------+------+-------+-----+-----+  |

    |  |label|edit|       |input |       |label|edit |  |

    |  +-----+----+-------+------+-------+-----+-----+  |

    |  |label|edit|       |input |       |label|edit |  |

    |  +-----+----+-------+------+-------+-----+-----+  |

    +---------------------------------------------------+

    |                                                   |

    |  +---------- graph horizontal layout ----------+  |

    |  |                      |                      |  |

    |  |       left graph     |      right graph     |  |

    |  |                      |                      |  |

    |  +----------------------+----------------------+  |

    +---------------------------------------------------+

    |                                                   |

    |  +--------- button horizontal layout ----------+  |

    |  |        |                           |        |  |

    |  | button |         (stretch)         | button |  |

    |  |        |                           |        |  |

    |  +--------+---------------------------+--------+  |

    +---------------------------------------------------+ 

以下是它的显示方式:

这就是代码。请注意,我从初始化中删除了小部件创建(如果您使用函数,那么在其他地方创建它们没有多大意义)。initUi


from PyQt5 import QtWidgets, QtCore

from matplotlib.figure import Figure

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

import sys



class Okno(QtWidgets.QMainWindow):

    def __init__(self):

        super(Okno, self).__init__()

        self.setGeometry(500, 500, 900, 500)

        self.setWindowTitle("My window")

        self.iniUI()


    def iniUI(self):

        w = QtWidgets.QWidget()

        self.setCentralWidget(w)


        mainLayout = QtWidgets.QVBoxLayout(w)


        grid = QtWidgets.QGridLayout()

        mainLayout.addLayout(grid)


        self.dataInputLabel = QtWidgets.QLabel('Data Input')

        grid.addWidget(self.dataInputLabel, 0, 0)

        self.dataInputLabel.setStyleSheet('color: red')


        portSettingLabel = QtWidgets.QLabel('Port setting', alignment=QtCore.Qt.AlignCenter)

        grid.addWidget(portSettingLabel, 0, 3)


        self.dataOutputLabel = QtWidgets.QLabel('Data Output', alignment=QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)

        grid.addWidget(self.dataOutputLabel, 0, 6)

        self.dataOutputLabel.setStyleSheet('color: blue')


        # set the vertical policy to Maximum for labels, so they don't try to

        # expand themselves if there's more available space

        for label in (self.dataInputLabel, portSettingLabel, self.dataOutputLabel):

            label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)


        grid.addWidget(QtWidgets.QLabel('Pressure [kPa]'), 1, 0)

        self.inputPressure = QtWidgets.QLineEdit(readOnly=True)

        grid.addWidget(self.inputPressure, 1, 1)


        grid.addWidget(QtWidgets.QLabel('Temperature [K]'), 2, 0)

        self.inputTemp = QtWidgets.QLineEdit(readOnly=True)

        grid.addWidget(self.inputTemp, 2, 1)


        grid.addWidget(QtWidgets.QLabel('Humidity [%]'), 3, 0)

        self.inputHumidity = QtWidgets.QLineEdit(readOnly=True)

        grid.addWidget(self.inputHumidity, 3, 1)


        self.portEdit = QtWidgets.QLineEdit(placeholderText='Enter port')

        grid.addWidget(self.portEdit, 1, 3)

        self.baudEdit = QtWidgets.QLineEdit(placeholderText='Baudrate')

        grid.addWidget(self.baudEdit, 2, 3)

        self.parityEdit = QtWidgets.QLineEdit(placeholderText='Parity')

        grid.addWidget(self.parityEdit, 3, 3)


        grid.addWidget(QtWidgets.QLabel('Pressure [kPa]'), 1, 5)

        self.outputPressure = QtWidgets.QLineEdit(readOnly=True)

        grid.addWidget(self.outputPressure, 1, 6)


        grid.addWidget(QtWidgets.QLabel('Temperature [K]'), 2, 5)

        self.outputTemp = QtWidgets.QLineEdit(readOnly=True)

        grid.addWidget(self.outputTemp, 2, 6)


        grid.addWidget(QtWidgets.QLabel('Humidity [%]'), 3, 5)

        self.outputHumidity = QtWidgets.QLineEdit(readOnly=True)

        grid.addWidget(self.outputHumidity, 3, 6)


        grid.setColumnStretch(2, 1)

        grid.setColumnStretch(4, 1)


        graphLayout = QtWidgets.QHBoxLayout()

        mainLayout.addLayout(graphLayout)

        # here insert your graphs...

        self.graphLeft = FigureCanvas(Figure())

        graphLayout.addWidget(self.graphLeft)

        self.graphRight = FigureCanvas(Figure())

        graphLayout.addWidget(self.graphRight)


        buttonLayout = QtWidgets.QHBoxLayout()

        mainLayout.addLayout(buttonLayout)


        self.openButton = QtWidgets.QPushButton('Open file')

        self.openButton.setMinimumWidth(150)

        self.openButton.clicked.connect(self.open_file)

        buttonLayout.addWidget(self.openButton)


        # add an empty "stretch", which acts as an expanding spacer on box layouts

        buttonLayout.addStretch()


        self.exitButton = QtWidgets.QPushButton('Exit')

        self.exitButton.clicked.connect(self.close)

        buttonLayout.addWidget(self.exitButton)

最后,考虑使用Qt Designer,这对于创建复杂的布局非常有用(或者,如果您仍然想通过代码完成所有操作,则至少在设计它们的过程中可视化它们)。请注意,在这种情况下,您应该遵循使用设计器的建议准则(最重要的是,永远不要编辑使用实用程序生成的python文件),或者使用模块中的(其中是要使用ui设置的小部件/窗口)。pyuicloadUi('yourguifile.ui', self)selfPyQt5.uic

查看完整回答
反对 回复 2022-09-20
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信