如何显示在另一个 QWidget Class 中创建的小部件?
How to show widgets created in another QWidget Class?
我尝试使用 PyQt5 创建一个 UI,用户可以在其中创建和删除标签,每个标签都是在文本输入 (QLineEdit) 之后创建的按钮 (QPushButton),并且每个标签按钮都是伴随着一个关联的 X 按钮,单击它会删除标签。
为此,我创建了第一个 QWidget class 来创建和显示主要的 Widget(输入框、添加标签按钮和整体布局)。
然后我创建了第二个 QWidget class 来生成每个标签按钮及其关联的 X 按钮。当用户单击第一个 QWidget class.
的“添加标签”按钮时,会生成此类元素
我的问题是我现在找不到如何正确显示此类生成的标签和 X 按钮。当我点击添加标签按钮时没有任何显示,而生成标签和 X 按钮的函数被正确调用(我用打印检查过)。
GUI无法显示标签和X按钮:
代码如下:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QGroupBox
import sys
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setWindowTitle("My Program")
self.setGeometry(100, 100, 1500, 1500)
self.initUI()
def initUI(self):
widgets = MainWidgets()
self.setCentralWidget(widgets)
class MainWidgets(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.grid = QGridLayout()
self.grid.setColumnStretch(0, 1)
self.grid.setColumnStretch(1, 1)
self.grid.setColumnStretch(2, 1)
self.grid.setColumnStretch(3, 1)
self.labelEntry = QLineEdit(self)
self.addLabelButton = QPushButton(self)
self.addLabelButton.setText("Add Label")
self.addLabelButton.clicked.connect(self.addNewLabel)
self.hbox_labelAdd = QVBoxLayout()
self.hbox_labelAdd.addWidget(self.labelEntry)
self.hbox_labelAdd.addWidget(self.addLabelButton)
self.vbox1 = QVBoxLayout()
self.vbox1.addLayout(self.hbox_labelAdd)
self.vbox2 = QVBoxLayout()
self.vbox2.addStretch(1)
self.vbox_right = QVBoxLayout()
self.vbox_right.addLayout(self.vbox1)
self.vbox_right.addLayout(self.vbox2)
self.groupBox = QGroupBox("Labelling")
self.groupBox.setLayout(self.vbox_right)
self.grid.addWidget(self.groupBox, 0, 3)
self.setLayout(self.grid)
def addNewLabel(self):
labelname = self.labelEntry.text()
newLabelItems = Labels(self, labelname)
self.vbox1.addWidget(newLabelItems)
class Labels(QWidget):
def __init__(self, parent, labelname, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.mylabelname = labelname
self.initUI()
def initUI(self):
self.labelButton = QPushButton(self)
self.labelButton.setText(str(self.mylabelname))
self.labelButton.clicked.connect(self.printbutton)
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.clicked.connect(self.erasebutton)
def printbutton(self):
print('clicked:', self.labelButton.text())
def erasebutton(self):
self.labelButton.deleteLater()
self.buttonErase.deleteLater()
if __name__ == '__main__':
app = QApplication(sys.argv)
# app.setStyle('Fusion')
window = MyWindow()
window.show()
sys.exit(app.exec_())
我找到了一个技巧,创建一个空的 QPushButton 并将其关联到布局中的标签和 X 按钮,这允许显示标签和 X 按钮,但这不是一个长期的解决方案,而且我可以找不到在布局中全宽显示这些标签和 X 按钮的方法,由于某些我无法解释的原因,限制在布局的一半(无论我使用网格、Vbox 还是 Hbox 布局)。
技巧代码如下(替换之前代码中的def addNewLabel(self)函数):
def addNewLabel(self):
labelname = self.labelEntry.text()
newLabelItems = Labels(self, labelname)
fake_widget = QPushButton(self)
labelitems_lay = QHBoxLayout()
labelitems_lay.addWidget(fake_widget)
labelitems_lay.addWidget(newLabelItems)
self.vbox1.addLayout(labelitems_lay)
在下图中你可以看到这个技巧的样子:
GUI 技巧 - 放大感兴趣的区域:
总体目标是能够以与此图片中非常相似的方式生成按钮:
表示所需输出的方案:
我认为我遇到的问题与布局有关,因为昨天感谢@furas 我能够实现这个目标,但使用 move() 函数来显示按钮。现在,我正在尝试使用布局来组织我的 UI,不幸的是,我无法再实现它了。
一种方法是将两个按钮添加到 Labels.initUi
中的布局,例如
class Labels(QWidget):
....
def initUI(self):
self.labelButton = QPushButton(self)
self.labelButton.setText(str(self.mylabelname))
self.labelButton.clicked.connect(self.printbutton)
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.clicked.connect(self.erasebutton)
layout = QHBoxLayout(self)
layout.setContentsMargins(0,0,0,0)
layout.addWidget(self.labelButton, stretch=1)
layout.addWidget(self.buttonErase, stretch=0)
我尝试使用 PyQt5 创建一个 UI,用户可以在其中创建和删除标签,每个标签都是在文本输入 (QLineEdit) 之后创建的按钮 (QPushButton),并且每个标签按钮都是伴随着一个关联的 X 按钮,单击它会删除标签。
为此,我创建了第一个 QWidget class 来创建和显示主要的 Widget(输入框、添加标签按钮和整体布局)。
然后我创建了第二个 QWidget class 来生成每个标签按钮及其关联的 X 按钮。当用户单击第一个 QWidget class.
的“添加标签”按钮时,会生成此类元素我的问题是我现在找不到如何正确显示此类生成的标签和 X 按钮。当我点击添加标签按钮时没有任何显示,而生成标签和 X 按钮的函数被正确调用(我用打印检查过)。
GUI无法显示标签和X按钮:
代码如下:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QGroupBox
import sys
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setWindowTitle("My Program")
self.setGeometry(100, 100, 1500, 1500)
self.initUI()
def initUI(self):
widgets = MainWidgets()
self.setCentralWidget(widgets)
class MainWidgets(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.grid = QGridLayout()
self.grid.setColumnStretch(0, 1)
self.grid.setColumnStretch(1, 1)
self.grid.setColumnStretch(2, 1)
self.grid.setColumnStretch(3, 1)
self.labelEntry = QLineEdit(self)
self.addLabelButton = QPushButton(self)
self.addLabelButton.setText("Add Label")
self.addLabelButton.clicked.connect(self.addNewLabel)
self.hbox_labelAdd = QVBoxLayout()
self.hbox_labelAdd.addWidget(self.labelEntry)
self.hbox_labelAdd.addWidget(self.addLabelButton)
self.vbox1 = QVBoxLayout()
self.vbox1.addLayout(self.hbox_labelAdd)
self.vbox2 = QVBoxLayout()
self.vbox2.addStretch(1)
self.vbox_right = QVBoxLayout()
self.vbox_right.addLayout(self.vbox1)
self.vbox_right.addLayout(self.vbox2)
self.groupBox = QGroupBox("Labelling")
self.groupBox.setLayout(self.vbox_right)
self.grid.addWidget(self.groupBox, 0, 3)
self.setLayout(self.grid)
def addNewLabel(self):
labelname = self.labelEntry.text()
newLabelItems = Labels(self, labelname)
self.vbox1.addWidget(newLabelItems)
class Labels(QWidget):
def __init__(self, parent, labelname, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.mylabelname = labelname
self.initUI()
def initUI(self):
self.labelButton = QPushButton(self)
self.labelButton.setText(str(self.mylabelname))
self.labelButton.clicked.connect(self.printbutton)
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.clicked.connect(self.erasebutton)
def printbutton(self):
print('clicked:', self.labelButton.text())
def erasebutton(self):
self.labelButton.deleteLater()
self.buttonErase.deleteLater()
if __name__ == '__main__':
app = QApplication(sys.argv)
# app.setStyle('Fusion')
window = MyWindow()
window.show()
sys.exit(app.exec_())
我找到了一个技巧,创建一个空的 QPushButton 并将其关联到布局中的标签和 X 按钮,这允许显示标签和 X 按钮,但这不是一个长期的解决方案,而且我可以找不到在布局中全宽显示这些标签和 X 按钮的方法,由于某些我无法解释的原因,限制在布局的一半(无论我使用网格、Vbox 还是 Hbox 布局)。
技巧代码如下(替换之前代码中的def addNewLabel(self)函数):
def addNewLabel(self):
labelname = self.labelEntry.text()
newLabelItems = Labels(self, labelname)
fake_widget = QPushButton(self)
labelitems_lay = QHBoxLayout()
labelitems_lay.addWidget(fake_widget)
labelitems_lay.addWidget(newLabelItems)
self.vbox1.addLayout(labelitems_lay)
在下图中你可以看到这个技巧的样子:
GUI 技巧 - 放大感兴趣的区域:
总体目标是能够以与此图片中非常相似的方式生成按钮:
表示所需输出的方案:
我认为我遇到的问题与布局有关,因为昨天感谢@furas 我能够实现这个目标,但使用 move() 函数来显示按钮。现在,我正在尝试使用布局来组织我的 UI,不幸的是,我无法再实现它了。
一种方法是将两个按钮添加到 Labels.initUi
中的布局,例如
class Labels(QWidget):
....
def initUI(self):
self.labelButton = QPushButton(self)
self.labelButton.setText(str(self.mylabelname))
self.labelButton.clicked.connect(self.printbutton)
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.clicked.connect(self.erasebutton)
layout = QHBoxLayout(self)
layout.setContentsMargins(0,0,0,0)
layout.addWidget(self.labelButton, stretch=1)
layout.addWidget(self.buttonErase, stretch=0)