<p>当您有两个以某种方式交互的小部件时,创建一个自定义小部件来为您处理所有事情通常会更简单。我已经编写了一个定制的<code>QColorWidget</code><a href="http://martinfitzpatrick.name/article/qcolorbutton-a-color-selector-tool-for-pyqt/" rel="nofollow noreferrer">here</a>,它显示一个按钮,一旦按下它就会显示一个颜色对话框。选择一种颜色会改变按钮的颜色,但在<code>QLineEdit</code>中显示为十六进制颜色很简单。原始代码为:</p>
<pre><code>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)
</code></pre>
<p>我们可以修改它来显示一个<code>QLineEdit</code>相邻的元素,如下所示。我们不是直接从<code>QPushButton</code>继承,而是从泛型<code>QWidget</code>继承。为此,我们设置了一个包含<code>QLabel</code>和<code>QPushButton</code>的布局。我们现在不再在内部存储颜色(作为<code>_color</code>),而是通过<code>QLabel.text()</code>和<code>QLabel.setText()</code>从<code>QLabel</code>中设置和检索颜色。你知道吗</p>
<pre><code>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())
</code></pre>
<p>这就是它的样子:</p>
<p><img src="https://i.stack.imgur.com/DU0aS.png" alt="Screenshot of QColorLineEditButton"/></p>
<p>你可以像平常一样把它添加到你的表单中</p>
<pre><code>color1 = QColorLineEditButton()
layout.addWidget(color1)
</code></pre>
<p>然后使用color()访问函数读取值。你知道吗</p>
<pre><code>current_color_1 = color1.color()
</code></pre>
<p>然而,如果您要在一个表单上处理很多小部件,这可能会变得非常麻烦。在这种情况下,我可以为PyQt配置管理器模块<a href="http://martinfitzpatrick.name/article/pyqtconfig-a-simple-api-for-keeping-your-pyqt-widgets-and-config-in-sync/" rel="nofollow noreferrer">PyQtConfig</a>制作一个小插件,它允许您通过标准Python dict接口访问(设置和获取)多个小部件。你知道吗</p>