如何在组合框中选择下拉列表后创建文本框
how to create a text box after a selecting a dropdown in combobox
我试图在从组合框中选择文本框选项后创建文本框,并在选择图像选项后添加图像。我需要这方面的帮助。
我知道 self.line = QLineEdit 将创建一个文本框,对于组合框,我可以使用 combo.activated[str].connect(self.onChanged) 来检测组合框的变化和调用该函数,但我不知道为什么我将它放入 onChanged 函数后它不起作用。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Example(QMainWindow):
def __init__(self):
super().__init__()
combo = QComboBox(self)
combo.addItem("textbox")
combo.addItem("image")
combo.move(50, 50)
self.qlabel = QLabel(self)
self.qlabel.move(50,16)
combo.activated[str].connect(self.onChanged)
self.setGeometry(50,50,320,200)
self.setWindowTitle("Programme")
self.show()
def onChanged(self, text):
if text == 'textbox':
self.line = QLineEdit(self)
if text == 'image':
self.im = QPixmap("image.jpg")
self.label = QLabel()
self.label.setPixmap(self.im)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
使用已显示已经的父级创建的项目不会自动显示,并且必须显式调用show()
或setVisible(True)
,除非它们被添加到布局中。
在您的情况下,您需要添加self.line.show()
或self.label.show()
,但您还需要使用父参数创建标签:self.label = QLabel(self)
,否则将被视为顶级小部件,它将显示在单独的 window.
上
考虑到像这样创建小部件可能会产生一些问题,特别是如果选择不止一次:如果您希望新选择覆盖 以前的小部件,您需要删除它,并且在任何情况下您都应该将小部件添加到布局中(无论如何都应该创建,因为通常不鼓励使用固定的几何图形)。如上所述,将新的小部件添加到布局会自动显示它,因此无需再显式显示它。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Programme")
central = QWidget()
self.setCentralWidget(central)
self.layout = QVBoxLayout(central)
combo = QComboBox(self)
combo.addItems(("textbox", "image"))
self.layout.addWidget(combo)
self.overwriteCheck = QCheckBox('Overwrite')
self.layout.addWidget(self.overwriteCheck)
self.lastWidget = None
combo.activated[str].connect(self.onChanged)
self.show()
def onChanged(self, text):
if self.lastWidget and self.overwriteCheck.isChecked():
self.layout.removeWidget(self.lastWidget)
self.lastWidget.deleteLater()
if text == 'textbox':
self.lastWidget = QLineEdit()
elif text == 'image':
self.lastWidget = QLabel()
self.lastWidget.setPixmap(QPixmap("image.jpg"))
self.layout.addWidget(self.lastWidget)
if self.overwriteCheck.isChecked():
QApplication.processEvents()
self.adjustSize()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
我试图在从组合框中选择文本框选项后创建文本框,并在选择图像选项后添加图像。我需要这方面的帮助。
我知道 self.line = QLineEdit 将创建一个文本框,对于组合框,我可以使用 combo.activated[str].connect(self.onChanged) 来检测组合框的变化和调用该函数,但我不知道为什么我将它放入 onChanged 函数后它不起作用。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Example(QMainWindow):
def __init__(self):
super().__init__()
combo = QComboBox(self)
combo.addItem("textbox")
combo.addItem("image")
combo.move(50, 50)
self.qlabel = QLabel(self)
self.qlabel.move(50,16)
combo.activated[str].connect(self.onChanged)
self.setGeometry(50,50,320,200)
self.setWindowTitle("Programme")
self.show()
def onChanged(self, text):
if text == 'textbox':
self.line = QLineEdit(self)
if text == 'image':
self.im = QPixmap("image.jpg")
self.label = QLabel()
self.label.setPixmap(self.im)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
使用已显示已经的父级创建的项目不会自动显示,并且必须显式调用show()
或setVisible(True)
,除非它们被添加到布局中。
在您的情况下,您需要添加self.line.show()
或self.label.show()
,但您还需要使用父参数创建标签:self.label = QLabel(self)
,否则将被视为顶级小部件,它将显示在单独的 window.
考虑到像这样创建小部件可能会产生一些问题,特别是如果选择不止一次:如果您希望新选择覆盖 以前的小部件,您需要删除它,并且在任何情况下您都应该将小部件添加到布局中(无论如何都应该创建,因为通常不鼓励使用固定的几何图形)。如上所述,将新的小部件添加到布局会自动显示它,因此无需再显式显示它。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Programme")
central = QWidget()
self.setCentralWidget(central)
self.layout = QVBoxLayout(central)
combo = QComboBox(self)
combo.addItems(("textbox", "image"))
self.layout.addWidget(combo)
self.overwriteCheck = QCheckBox('Overwrite')
self.layout.addWidget(self.overwriteCheck)
self.lastWidget = None
combo.activated[str].connect(self.onChanged)
self.show()
def onChanged(self, text):
if self.lastWidget and self.overwriteCheck.isChecked():
self.layout.removeWidget(self.lastWidget)
self.lastWidget.deleteLater()
if text == 'textbox':
self.lastWidget = QLineEdit()
elif text == 'image':
self.lastWidget = QLabel()
self.lastWidget.setPixmap(QPixmap("image.jpg"))
self.layout.addWidget(self.lastWidget)
if self.overwriteCheck.isChecked():
QApplication.processEvents()
self.adjustSize()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())