PyQt5: диалоговое окно «Нет заливки цветом»?

Я кодирую графический интерфейс в PyQt5, где мне нужна палитра цветов. До сих пор я использую класс QColorDialog, который отлично работает для выбора цвета, но моя проблема в том, что, похоже, нет способа выбрать «без цвета» (или «без заливки», как это известно из PowerPoint или Adobe Illustrator) .

Как добиться выбора «без цвета»? (В документации упоминается только флаг прозрачности, но мне это бесполезно...)


person Luigi_Papardelle    schedule 14.02.2016    source источник
comment
В диалоговом окне цвета указывается QColor. Итак, какой QColor, по вашему мнению, соответствует отсутствию заливки и чем он отличается от полностью прозрачного?   -  person ekhumoro    schedule 14.02.2016
comment
Может быть, это поможет, если я опишу более подробно, что мне нужно: когда пользователь выбирает цвет, диалоговое окно закрывается, и фон кнопки устанавливается на этот цвет, чтобы указать, какой цвет выбран. Если пользователю не нужен цвет, я хотел бы иметь вариант, как в иллюстраторе, где вы нажимаете на белую иконку с толстой красной линией, которая обозначает отсутствие заливки. я могу представить обходной путь с прозрачностью, но я думаю, что с точки зрения удобства использования это уродливая конструкция. Плюс: я пытался установить ShowAlphaChannel-Flag, но диалог выглядит как раньше? Разве не должно быть поля или ползунка для прозрачности?   -  person Luigi_Papardelle    schedule 15.02.2016
comment
Вы вообще не ответили на мои вопросы, поэтому я до сих пор понятия не имею, что должна делать без заполнения. Нет хороших слов, как в Illustrator — не все используют Windows, а те, кто использует, возможно, никогда не использовали такие программы. Что касается флага альфа-канала: я предполагаю, что вы используете собственный цветной диалог Windows, который, по-видимому, не имеет возможности отображать альфа-канал. Если вы установите параметры ShowAlphaChannel|DontUseNativeDialog, это будет показано.   -  person ekhumoro    schedule 15.02.2016
comment
PS: Я также должен спросить - зачем пользователю открывать диалоговое окно цвета, если ему на самом деле не нужен цвет? Читая между строк, я предполагаю, что вы на самом деле хотите сбросить некоторые настройки цвета до значения по умолчанию. То есть вы хотите разрешить пользователю удалять текущие настройки цвета. Я думаю, что правильный способ сделать это - предоставить явный пункт меню «Восстановить по умолчанию» (или что-то еще), а не пытаться заставить цветовой диалог делать что-то, для чего он не предназначен.   -  person ekhumoro    schedule 15.02.2016
comment
@ekhumoro А, извини, я не подумал об этом. Итак, что я мог бы использовать, так это то, что если будет выбрано отсутствие заливки, будет возвращено значение, подобное -1 (или любой другой код, но не допустимый цвет rgb) - тогда я мог бы обработать случай в моем коде, зная, что заполнение не требуется. Я также пробовал DontUseNativeDialog, но ничего не меняется. Когда я проверяю свои настройки с помощью testOption(), он оценивает True, поэтому флаги/параметры, похоже, установлены правильно. Может быть, это ошибка в pyqt5?   -  person Luigi_Papardelle    schedule 15.02.2016
comment
Ошибка в вашем коде, а не в pyqt5. Он отлично работает с параметрами, которые я указал в своем комментарии выше.   -  person ekhumoro    schedule 15.02.2016
comment
Хорошо, если у вас работает, я постараюсь выяснить, что там не так. В любом случае, я хотел избежать создания дополнительной кнопки «Восстановить по умолчанию», но похоже, что другого варианта, кроме этого, нет. Спасибо за вашу помощь!   -  person Luigi_Papardelle    schedule 15.02.2016
comment
Если вы не возражаете против использования диалогового окна неродного цвета, можно было бы создать пользовательскую версию с некоторыми дополнительными кнопками. Скоро выложу пример.   -  person ekhumoro    schedule 15.02.2016


Ответы (1)


Если вы не возражаете против использования неродного диалога, его довольно легко настроить.

Ниже приведена очень простая реализация, которая показывает, как встроить существующий диалог и добавить дополнительную кнопку «Нет цвета» внизу. Остальная часть реализации оставлена ​​в качестве упражнения для читателя...

from PyQt5 import QtCore, QtWidgets

class ColorDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        widget = QtWidgets.QColorDialog()
        widget.setWindowFlags(QtCore.Qt.Widget)
        widget.setOptions(
            QtWidgets.QColorDialog.DontUseNativeDialog |
            QtWidgets.QColorDialog.NoButtons)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(widget)
        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(QtWidgets.QPushButton('No Color'))
        hbox.addWidget(QtWidgets.QPushButton('Cancel'))
        hbox.addWidget(QtWidgets.QPushButton('Ok'))
        layout.addLayout(hbox)

if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    dialog = ColorDialog()
    dialog.show()
    sys.exit(app.exec_())
person ekhumoro    schedule 15.02.2016