我正在构建的应用程序如下所示:
该应用程序将包含更多QToolButtons和QLineEdits。按下QTool按钮时,始终会显示颜色对话框。颜色的十六进制代码被添加到LineEdit。是否有可能每个QLineEdit都与QToolButton相关联,因此当按下按钮时,应用程序会自动知道要添加文本的LineEdit。目前我使用的代码是:
self.connect(self.bgbut, SIGNAL("clicked()"),self.bgbut_click) #bgbut is the QToolButton
然后致电
def bgbut_click(self):
但是对于我将添加的十五行编辑和ToolButtons,这将变得不切实际。那么有没有办法有效地将每个工具按钮与相应的LineEdit相关联?
答案 0 :(得分:0)
我建议你做以下三个步骤。
步骤1:在设置窗口小部件的UI时或之后,创建一个字典,其中所有按钮都作为键,所有行编辑为值。
self.button_map = {}
self.button_map[self.but1] = self.edit1
self.button_map[self.but2] = self.edit2
..
步骤2:将所有按钮连接到窗口小部件中的相同方法。我猜你已经做到了。
self.but1.clicked.connect(self.buttons_clicked)
self.but2.clicked.connect(self.buttons_clicked)
..
步骤3:在连接到所有按钮的方法中获取sender
,从之前创建的字典中查找相应的行编辑并相应地设置文本。
def buttons_clicked(self):
text = color_dialog_get_some_text() # customize this
self.button_map[self.sender].setText(text)
答案 1 :(得分:0)
当您有两个以某种方式进行交互的小部件时,创建自定义小部件以便为您处理所有内容通常更简单。我已经编写了一个自定义QColorWidget
here,它会显示一个按钮,按下后会显示一个颜色对话框。选择颜色会更改按钮的颜色,但很容易将其显示为QLineEdit
中的十六进制颜色。原始代码是:
class QColorButton(QPushButton):
'''
Custom Qt Widget to show a chosen color.
Left-clicking the button shows the color-chooser, while
right-clicking resets the color to None (no-color).
'''
colorChanged = pyqtSignal()
def __init__(self, *args, **kwargs):
super(QColorButton, self).__init__(*args, **kwargs)
self._color = None
self.setMaximumWidth(32)
self.pressed.connect(self.onColorPicker)
def setColor(self, color):
if color != self._color:
self._color = color
self.colorChanged.emit()
if self._color:
self.setStyleSheet("background-color: %s;" % self._color)
else:
self.setStyleSheet("")
def color(self):
return self._color
def onColorPicker(self):
'''
Show color-picker dialog to select color.
Qt will use the native dialog by default.
'''
dlg = QColorDialog(self)
if self._color:
dlg.setCurrentColor(QColor(self._color))
if dlg.exec_():
self.setColor(dlg.currentColor().name())
def mousePressEvent(self, e):
if e.button() == Qt.RightButton:
self.setColor(None)
return super(QColorButton, self).mousePressEvent(e)
我们可以修改此项以显示QLineEdit
相邻,如下所示。而不是直接从QPushButton
继承我们从通用QWidget
继承。为此,我们设置了包含QLabel
和QPushButton
的布局。我们现在不是在内部存储颜色(_color
),而是通过QLabel
和QLabel.text()
从QLabel.setText()
设置并检索它。
class QColorLineEditButton(QWidget):
'''
Custom Qt Widget to show a chosen color alongside a QLineEdit.
Left-clicking the button shows the color-chooser, while
right-clicking resets the color to None (no-color).
'''
colorChanged = pyqtSignal()
def __init__(self, *args, **kwargs):
super(QColorLineEditButton, self).__init__(*args, **kwargs)
layout = QHBoxLayout()
self.le = QLineEdit()
self.le.setMaximumWidth(100)
self.btn = QPushButton()
self.btn.setMaximumWidth(32)
layout.addWidget(self.le)
layout.addWidget(self.btn)
self.setLayout(layout)
self.btn.pressed.connect(self.onColorPicker)
def setColor(self, color):
if color != self.le.text():
self.le.setText(color)
self.colorChanged.emit()
if self.le.text():
self.btn.setStyleSheet("background-color: %s;" % self.le.text())
else:
self.btn.setStyleSheet("")
def color(self):
return self.le.text()
def onColorPicker(self):
'''
Show color-picker dialog to select color.
Qt will use the native dialog by default.
'''
dlg = QColorDialog(self)
if self.le.text():
dlg.setCurrentColor(QColor(self.le.text()))
if dlg.exec_():
self.setColor(dlg.currentColor().name())
它的外观如下:
您可以像往常一样将其添加到表单中。
color1 = QColorLineEditButton()
layout.addWidget(color1)
然后使用color()访问函数读取值。
current_color_1 = color1.color()
但是,如果您要在表单上处理大量小部件,可能会非常麻烦。在这种情况下,我可以为我的PyQt配置管理器模块PyQtConfig创建一个小插件,它允许您通过标准的Python dict接口访问(设置和获取)多个小部件。