将许多QButton与许多QLineEdits相关联

时间:2014-06-19 10:34:23

标签: python pyqt pyside

我正在构建的应用程序如下所示:enter image description here

该应用程序将包含更多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相关联?

2 个答案:

答案 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继承。为此,我们设置了包含QLabelQPushButton的布局。我们现在不是在内部存储颜色(_color),而是通过QLabelQLabel.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())

它的外观如下:

Screenshot of QColorLineEditButton

您可以像往常一样将其添加到表单中。

color1 = QColorLineEditButton()
layout.addWidget(color1)

然后使用color()访问函数读取值。

current_color_1 = color1.color()

但是,如果您要在表单上处理大量小部件,可能会非常麻烦。在这种情况下,我可以为我的PyQt配置管理器模块PyQtConfig创建一个小插件,它允许您通过标准的Python dict接口访问(设置和获取)多个小部件。