QT控件大全 二十五 QColorWidgets

来源:互联网 发布:行书字帖 知乎 编辑:程序博客网 时间:2024/05/17 09:35

效果如图:

核心代码:

#ifndef COLOR_SELECTOR_HPP#define COLOR_SELECTOR_HPP#include "color_preview.hpp"#include "color_wheel.hpp"namespace color_widgets {/** * Color preview that opens a color dialog */class QCP_EXPORT ColorSelector : public ColorPreview{    Q_OBJECT    Q_ENUMS(UpdateMode)    Q_PROPERTY(UpdateMode updateMode READ updateMode WRITE setUpdateMode )    Q_PROPERTY(Qt::WindowModality dialogModality READ dialogModality WRITE setDialogModality )    Q_PROPERTY(ColorWheel::DisplayFlags wheelFlags READ wheelFlags WRITE setWheelFlags NOTIFY wheelFlagsChanged)public:    enum UpdateMode {        Confirm, ///< Update color only after the dialog has been accepted        Continuous ///< Update color as it's being modified in the dialog    };    explicit ColorSelector(QWidget *parent = 0);    ~ColorSelector();    void setUpdateMode(UpdateMode m);    UpdateMode updateMode() const;    Qt::WindowModality dialogModality() const;    void setDialogModality(Qt::WindowModality m);    ColorWheel::DisplayFlags wheelFlags() const;Q_SIGNALS:    void wheelFlagsChanged(ColorWheel::DisplayFlags flags);public Q_SLOTS:    void showDialog();    void setWheelFlags(ColorWheel::DisplayFlags flags);private Q_SLOTS:    void accept_dialog();    void reject_dialog();    void update_old_color(const QColor &c);protected:    void dragEnterEvent(QDragEnterEvent *event);    void dropEvent(QDropEvent * event);private:    /// Connect/Disconnect colorChanged based on UpdateMode    void connect_dialog();    /// Disconnect from dialog update    void disconnect_dialog();    class Private;    Private * const p;    };} // namespace color_widgets#endif // COLOR_SELECTOR_HPP
#include "color_selector.hpp"#include "color_dialog.hpp"#include <QDropEvent>#include <QDragEnterEvent>#include <QMimeData>namespace color_widgets {class ColorSelector::Private{public:    UpdateMode update_mode;    ColorDialog *dialog;    QColor old_color;    Private(QWidget *widget) : dialog(new ColorDialog(widget))    {        dialog->setButtonMode(ColorDialog::OkCancel);    }};ColorSelector::ColorSelector(QWidget *parent) :    ColorPreview(parent), p(new Private(this)){    setUpdateMode(Continuous);    p->old_color = color();    connect(this,&ColorPreview::clicked,this,&ColorSelector::showDialog);    connect(this,SIGNAL(colorChanged(QColor)),this,SLOT(update_old_color(QColor)));    connect(p->dialog,&QDialog::rejected,this,&ColorSelector::reject_dialog);    connect(p->dialog,&ColorDialog::colorSelected, this, &ColorSelector::accept_dialog);    connect(p->dialog,&ColorDialog::wheelFlagsChanged,                this, &ColorSelector::wheelFlagsChanged);    setAcceptDrops(true);}ColorSelector::~ColorSelector(){    delete p;}ColorSelector::UpdateMode ColorSelector::updateMode() const{    return p->update_mode;}void ColorSelector::setUpdateMode(UpdateMode m){    p->update_mode = m;}Qt::WindowModality ColorSelector::dialogModality() const{    return p->dialog->windowModality();}void ColorSelector::setDialogModality(Qt::WindowModality m){    p->dialog->setWindowModality(m);}ColorWheel::DisplayFlags ColorSelector::wheelFlags() const{    return p->dialog->wheelFlags();}void ColorSelector::showDialog(){    p->old_color = color();    p->dialog->setColor(color());    connect_dialog();    p->dialog->show();}void ColorSelector::setWheelFlags(ColorWheel::DisplayFlags flags){    p->dialog->setWheelFlags(flags);}void ColorSelector::connect_dialog(){    if (p->update_mode == Continuous)        connect(p->dialog, SIGNAL(colorChanged(QColor)), this, SLOT(setColor(QColor)), Qt::UniqueConnection);    else        disconnect_dialog();}void ColorSelector::disconnect_dialog(){    disconnect(p->dialog, SIGNAL(colorChanged(QColor)), this, SLOT(setColor(QColor)));}void ColorSelector::accept_dialog(){    setColor(p->dialog->color());    p->old_color = color();}void ColorSelector::reject_dialog(){    setColor(p->old_color);}void ColorSelector::update_old_color(const QColor &c){    if (!p->dialog->isVisible())        p->old_color = c;}void ColorSelector::dragEnterEvent(QDragEnterEvent *event){    if ( event->mimeData()->hasColor() ||         ( event->mimeData()->hasText() && QColor(event->mimeData()->text()).isValid() ) )        event->acceptProposedAction();}void ColorSelector::dropEvent(QDropEvent *event){    if ( event->mimeData()->hasColor() )    {        setColor(event->mimeData()->colorData().value<QColor>());        event->accept();    }    else if ( event->mimeData()->hasText() )    {        QColor col(event->mimeData()->text());        if ( col.isValid() )        {            setColor(col);            event->accept();        }    }}} // namespace color_widgets







原创粉丝点击