PyQt5: ไม่มีการเติมกล่องโต้ตอบสีใช่ไหม

ฉันกำลังเขียน GUI ใน PyQt5 โดยที่ฉันต้องการเครื่องมือเลือกสี จนถึงตอนนี้ ฉันใช้ QColorDialog Class ซึ่งทำงานได้ดีในการเลือกสี - แต่ปัญหาของฉันคือดูเหมือนว่าจะไม่มีวิธีเลือก "ไม่มีสี" (หรือ "ไม่เติม" เหมือนกับที่ทราบจาก PowerPoint หรือ Adobe Illustrator) .

ทำอย่างไรถึงจะเลือก "ไม่มีสี"? (เอกสารกล่าวถึงการตั้งค่าสถานะเพื่อความโปร่งใสเท่านั้น แต่สิ่งนี้ไม่เป็นประโยชน์สำหรับฉัน...)


person Luigi_Papardelle    schedule 14.02.2016    source แหล่งที่มา
comment
กล่องโต้ตอบสีระบุ QColor แล้ว QColor คุณจะบอกว่าอะไรที่สอดคล้องกับการไม่เติม และความโปร่งใสทั้งหมดแตกต่างอย่างไร   -  person ekhumoro    schedule 14.02.2016
comment
อาจช่วยได้ถ้าฉันอธิบายรายละเอียดเพิ่มเติมว่าฉันต้องการอะไร: เมื่อผู้ใช้เลือกสี กล่องโต้ตอบจะปิดลงและพื้นหลังของปุ่มจะถูกตั้งค่าเป็นสีนั้น เพื่อระบุสีที่เลือก หากผู้ใช้ไม่ต้องการสี ฉันต้องการมีตัวเลือกเหมือนใน Illustrator โดยคลิกไอคอนสีขาวที่มีเส้นหนาสีแดงซึ่งหมายถึงไม่มีการเติม ฉันนึกภาพออกว่าต้องวิธีแก้ปัญหาด้วยความโปร่งใส แต่ฉันคิดว่าการใช้งานที่ชาญฉลาดนั้นเป็นโครงสร้างที่น่าเกลียด บวก: ฉันพยายามตั้งค่า ShowAlphaChannel-Flag แต่ Dialog ดูเหมือนเมื่อก่อนใช่ไหม ไม่ควรมีช่องหรือแถบเลื่อนเพื่อความโปร่งใสใช่ไหม   -  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() ระบบจะประเมินว่าเป็นจริง ดังนั้นดูเหมือนว่าตั้งค่าสถานะ/ตัวเลือกไว้อย่างถูกต้อง อาจเป็นข้อผิดพลาดใน pyqt5 หรือไม่   -  person Luigi_Papardelle    schedule 15.02.2016
comment
จุดบกพร่องอยู่ในรหัสของคุณ ไม่ใช่ pyqt5 มันทำงานได้ดีอย่างสมบูรณ์แบบกับตัวเลือกที่ฉันระบุไว้ในความคิดเห็นด้านบน   -  person ekhumoro    schedule 15.02.2016
comment
โอเค ถ้าคุณได้ผล ฉันจะพยายามค้นหาว่ามีอะไรผิดปกติที่นั่น อย่างไรก็ตาม ฉันต้องการหลีกเลี่ยงการสร้างปุ่ม Restore Default เพิ่มเติม แต่ดูเหมือนว่าจะไม่มีตัวเลือกอื่นนอกเหนือจากนี้ ขอบคุณสำหรับความช่วยเหลือของคุณ!   -  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