十七、颜色对话框QColorDialog
实现以下功能
创建一个QDialog工程
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include<QPushButton>
#include<QFrame>
#include<QColorDialog>
#include<QGridLayout>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
Ui::Dialog *ui;
QGridLayout *gl;
QPushButton *colorButton;
QFrame *colorFrame;
private slots:
void colorFunc();
};
#endif // DIALOG_H
dialog.cpp
首先实例化对象,并设置简单的布局
gl=new QGridLayout(this);
colorButton=new QPushButton("调用颜色对话框");
colorFrame=new QFrame();
colorFrame->setFrameShape(QFrame::Box);
colorFrame->setAutoFillBackground(true);
gl->addWidget(colorButton,0,0);
gl->addWidget(colorFrame,0,1);
void setFrameShape(QFrame::Shape):
此属性保存来自框架样式的框架形状值
void setAutoFillBackground(bool enabled):
此属性保留小部件背景是否自动填充
如果启用,此属性将导致Qt在调用paint事件之前填充小部件的背景。使用的颜色由小部件调色板中的QPalette::Window颜色角色定义。
此外,Windows总是被QPalette::Window填充,除非设置了WA_OpaquePaintEvent或WA_NoSystemBackground属性。
如果小部件的父类具有静态渐变背景,则此属性不能关闭(即设置为false)。
警告:与Qt样式表一起谨慎使用此属性。当小部件具有具有有效背景或边框图像的样式表时,此属性将自动禁用。
默认情况下,此属性为false。
设置槽函数
void Dialog::colorFunc()
{
QColor color=QColorDialog::getColor(Qt::red);
if(color.isValid())
{
colorFrame->setPalette(QPalette(color));
}
}
QColor QColorDialog::getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()):
弹出一个带有给定窗口标题的模态颜色对话框(如果没有指定,则为“Select color”),让用户选择颜色,并返回该颜色。颜色最初设置为initial。对话框是parent的子窗体。如果用户取消对话框,它将返回一个无效的颜色(参见QColor::isValid())。
options参数允许您自定义对话框。
bool QColor::isValid() const:
如果颜色有效则返回true;否则返回false。
void setPalette(const QPalette &):
此属性保存小部件的调色板
此属性描述小部件的调色板。在呈现标准组件时,小部件的样式使用该调色板,并且可以作为确保自定义小部件能够与本机平台的外观保持一致性的一种手段。不同的平台或不同的风格有不同的调色板是很常见的。
当您将新调色板分配给小部件时,该调色板中的颜色角色将与小部件的默认调色板组合在一起,形成小部件的最终调色板。小部件背景角色的调色板条目用于填充小部件的背景(参见QWidget::autoFillBackground),前台角色初始化QPainter的笔。
默认值取决于系统环境。QApplication维护一个系统/主题调色板,作为所有小部件的默认选项。对于某些类型的小部件,也可能有特殊的默认调色板(例如,在Windows Vista上,所有派生自QMenuBar的类都有一个特殊的默认调色板)。您还可以通过向QApplication::setPalette()传递一个自定义调色板和一个小部件的名称来为小部件定义默认的调色板。最后,样式总是有抛光调色板的选项,因为它被分配(参见QStyle::polish())。
QWidget将显式调色板角色从父角色传播到子角色。如果您将画笔或颜色分配给调色板上的特定角色,并将该调色板分配给小部件,则该角色将传播到小部件的所有子部件,覆盖该角色的任何系统默认值。请注意,默认情况下调色板不会传播到窗口(参见isWindow()),除非Qt::WA_WindowPropagation属性被启用。
QWidget的调色板传播与其字体传播类似。
当前的样式用于呈现所有标准Qt小部件的内容,可以自由地从小部件调色板中选择颜色和笔刷,或者在某些情况下,忽略调色板(部分地或完全地)。特别是,某些样式,如GTK样式、Mac样式和Windows Vista样式,依赖于第三方api来呈现小部件的内容,这些样式通常不遵循调色板。因此,为小部件的调色板分配角色并不能保证改变小部件的外观。相反,您可以选择应用样式表。
警告:不要将此函数与Qt样式表结合使用。当使用样式表时,可以使用“color”、“background-color”、“selection-color”、“selection-background-color”和“alternate-background-color”自定义小部件的调色板。
完整代码
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
gl=new QGridLayout(this);
colorButton=new QPushButton("调用颜色对话框");
colorFrame=new QFrame();
colorFrame->setFrameShape(QFrame::Box);
colorFrame->setAutoFillBackground(true);
gl->addWidget(colorButton,0,0);
gl->addWidget(colorFrame,0,1);
connect(colorButton,&QPushButton::clicked,this,&Dialog::colorFunc);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::colorFunc()
{
QColor color=QColorDialog::getColor(Qt::red);
if(color.isValid())
{
colorFrame->setPalette(QPalette(color));
}
}