我正在尝试创建图片编辑器,您可以在其中选择颜色,然后在屏幕左侧编辑图片。
因此,我需要一个QHBoxLayout来并排设置两个窗口。我无法将我的ColorDialog添加到QHBoxLayout。为了测试目的,我使用按钮代替了图片。

我厌倦了用.addWidget添加ColorDialog,但是没有用。
仍然显示ColorDialog,但侧面没有按钮。

def initUI(self):
    self.setWindowTitle(self.title)
    self.setGeometry(self.left, self.top, self.width, self.height)
    color = QColorDialog.getColor()

    horizontalbox = QHBoxLayout
    cancelbutton = QPushButton("CancelButton")
    horizontalbox.addWidget(cancelbutton)
    horizontalbox.addWidget(color)

    self.setLayout(horizontalbox)
    self.show()

最佳答案

QColorDialog.getColor()是静态方法,仅返回选定的QColor不允许获取小部件,因此您不应使用该方法,但必须创建QColorDialog类的对象,如下所示。

def initUI(self):
    self.setWindowTitle(self.title)
    self.setGeometry(self.left, self.top, self.width, self.height)

    colordialog = QColorDialog()
    colordialog.setOptions(QColorDialog.DontUseNativeDialog)
    colordialog.currentColorChanged.connect(self.on_color_changed)

    cancelbutton = QPushButton("CancelButton")

    horizontalbox = QHBoxLayout(self)
    horizontalbox.addWidget(cancelbutton)
    horizontalbox.addWidget(colordialog)
    self.show()

def on_color_changed(self, color):
    print(color)


更新:

QColorDialog是一个对话框窗口,其预定义行为是关闭该窗口,因此可能的解决方案是从按钮上断开所单击的信号,并在按下后获取颜色,您必须使用与另一插槽连接的所单击的信号。由于隐藏了一些内容,因此我也不需要看到QColorDialog的“取消”按钮。

def initUI(self):

    self.colordialog = QColorDialog()
    self.colordialog.setOptions(QColorDialog.DontUseNativeDialog)

    button_box = self.colordialog.findChild(QtWidgets.QDialogButtonBox)
    ok_button = button_box.button(QDialogButtonBox.Ok)
    ok_button.disconnect()
    ok_button.clicked.connect(self.on_ok_button_clicked)

    # hide cancelbutton
    cancel_button = button_box.button(QDialogButtonBox.Cancel)
    cancel_button.hide()

    cancelbutton = QPushButton("CancelButton")

    horizontalbox = QHBoxLayout(self)
    horizontalbox.addWidget(cancelbutton)
    horizontalbox.addWidget(self.colordialog)
    self.show()


def on_ok_button_clicked(self):
    color = self.colordialog.currentColor()
    print(color.name())

07-24 20:20