GUI学习之二十六——QColorDialog学习总结
今天要讲的是QColorDialog对话框。
一.描述
QColorDialog对话框是用来为用户提供颜色选择的对话框控件,和上一章的QFontDialog控件一样,是继承自QDialog这个基类。其使用方法和QFontDialog基本相同。
二.功能作用
1.构造函数
可以直接声明使用,也可以为其传递一个QColor对象作为默认颜色
color = QColor(30,40,50)
color_dialog =QColorDialog(color,self)
这里创建了一个RGB值为30,40,50的颜色对象,然后弹出看对话框就有了默认的颜色
2.打开对话框
打开对话框有三种常用方法:
QColorDialog.show() QColorDialog.open() QColorDialog.exec()
如果用show()方法话是可以发射colorSelected这个信号的
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() self.resize(800,500) def UI_test(self): btn = QPushButton('color',self) btn.move(50,50) btn.clicked.connect(self.fun) self.btn = btn pass def fun(self): color = QColor(30,40,50) color_dialog =QColorDialog(color,self) color_dialog.colorSelected.connect(self.change_color) color_dialog.show() def change_color(self,color): palette = QPalette() palette.setColor(QPalette.Background,color) self.setPalette(palette) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
而open()是直接传递个槽函数的,并且槽函数是没有参数传递的。只能手动获取。
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() self.resize(800,500) def UI_test(self): btn = QPushButton('color',self) btn.move(50,50) btn.clicked.connect(self.fun) self.btn = btn pass def fun(self): color = QColor(30,40,50) color_dialog =QColorDialog(color,self) color_dialog.colorSelected.connect(self.change_color) # color_dialog.show() color_dialog.open(self.change_color) self.col_dia = color_dialog def change_color(self): palette = QPalette() palette.setColor(QPalette.Background,self.col_dia.selectedColor()) #直接获取颜色值 self.setPalette(palette) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
exec是有个返回值的,只有点击确认键返回值为1。可以利用这个值来执行相对应的操作。
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() self.resize(800,500) def UI_test(self): btn = QPushButton('color',self) btn.move(50,50) btn.clicked.connect(self.fun) self.btn = btn pass def fun(self): color = QColor(30,40,50) color_dialog =QColorDialog(color,self) color_dialog.colorSelected.connect(self.change_color) # color_dialog.show() self.col_dia = color_dialog if self.col_dia.exec(): #利用exec的返回值 self.change_color() def change_color(self): palette = QPalette() palette.setColor(QPalette.Background,self.col_dia.selectedColor()) #直接获取颜色值 self.setPalette(palette) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
3.选项控制
QColorDialog.setOption(self, option: 'QColorDialog.ColorDialogOption', on: bool = ...) QColorDialog.setOptions(self, options: typing.Union['QColorDialog.ColorDialogOptions', 'QColorDialog.ColorDialogOption']) QColorDialog.testOption(self, option: 'QColorDialog.ColorDialogOption') #——>bool # type: 'QColorDialog.ColorDialogOption' ShowAlphaChannel # 允许选择Alpha分量(透明度) NoButtons # 取消确认、取消按钮 DontUseNativeDialog # 不使用原生色彩对话框而选用Qt的标准色彩对话框
其中NoButtons的选项常常结合当前色彩改变来实时作用改变颜色
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() self.resize(800,500) def UI_test(self): btn = QPushButton('color',self) btn.move(50,50) btn.clicked.connect(self.fun) self.btn = btn pass def fun(self): color = QColor(30,40,50) color_dialog =QColorDialog(color,self) color_dialog.colorSelected.connect(self.change_color) color_dialog.setOptions(QColorDialog.NoButtons | QColorDialog.ShowAlphaChannel) #取消按钮,开启透明度 color_dialog.currentColorChanged.connect(self.change_color) #当前颜色发生变化 self.col_dia = color_dialog color_dialog.show() def change_color(self,col): palette = QPalette() palette.setColor(QPalette.Background,col) self.setPalette(palette) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
4.静态方法
首先有个概念:标准颜色和自定义颜色。标准颜色是对话框提供的颜色(Basic Colors),而自定义颜色就是下面的用户定义的颜色(Custom Colors)。
自定义颜色一共用18组可以使用。顺序是从左上开使为0,0下面的是1,右边的是2。
QColorDialog.setCustomColor(index: int,color: typing.Union[QtGui.QColor, QtCore.Qt.GlobalColor, QtGui.QGradient]) #设定自定义颜色 QColorDialog.setStandardColor(index: int, color: typing.Union[QtGui.QColor, QtCore.Qt.GlobalColor, QtGui.QGradient]) #设定标准颜色
这两段代码是指定颜色格子里的颜色的,要注意的是自定义颜色必须是在对控件进行实例化以前定义。
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): QColorDialog.setCustomColor(1,QColor(50,60,70)) cd = QColorDialog(self) cd.show() pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
运行一下,可以发现自定义颜色位置1已经有了一个自定义颜色
还有一个静态方法是获取颜色
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): btn = QPushButton('test',self) btn.clicked.connect(self.color_change) pass def color_change(self): color = QColorDialog.getColor(QColor(50,50,30),self,title='选择颜色') #获取颜色 palete = QPalette() palete.setColor(QPalette.Background,color) self.setPalette(palete) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
注意一点,如果点击对话框的OK按钮可以改变当前的背景色,但是如果点击了Cancel为什么就变成黑的了?因为我们是在按钮的槽函数里定义的QColorDialog,那么每次点击按钮都会创建一个新的对话框,并且和当前的显示状态是没关系的,所以当点击了Cancel就改成默认的黑色了。
三.常用信号
和字体对话框的常用信号差不多。
QColorDialog.colorSelected() #颜色选择 QColorDialog.currentColorChanged() #当前颜色变化
用法和字体对话框也类似。我们直接放个案例就可以了
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): self.cd = QColorDialog(self) btn = QPushButton('test',self) btn.clicked.connect(lambda :self.cd.show()) self.cd.colorSelected.connect(self.color_change) #传递参数:color pass def color_change(self,color): palete = QPalette() palete.setColor(QPalette.Background,color) self.setPalette(palete) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): self.cd = QColorDialog(self) self.cd.setOptions(QColorDialog.NoButtons) #一般当前颜色变化是用作展示的,可以不用按钮 btn = QPushButton('test',self) btn.clicked.connect(lambda :self.cd.show()) self.cd.currentColorChanged.connect(self.color_change) pass def color_change(self,color): palete = QPalette() palete.setColor(QPalette.Background,color) self.setPalette(palete) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())