您的位置:首页 > 其它

实现TOOLBAR中颜色对话框的添加

2016-07-13 16:27 579 查看
如图所示:





取自QT本来的一个例子添加:

下面是代码:

void MainWindow::createToolbars()
{
//! [25]
editToolBar = addToolBar(tr("Edit"));
editToolBar->addAction(deleteAction);
editToolBar->addAction(toFrontAction);
editToolBar->addAction(sendBackAction);
//editToolBar->addAction(itemColorAction);
editToolBar->addWidget(m_colorButton_test);
<pre name="code" class="cpp">m_colorButton_test = new PopupColorButton();
itemColorAction_test = new QAction(QIcon(":/images/itemColor.png"), tr("&ItemColor"),this);
itemColorAction_test->setShortcut(tr("ItemColor"));
itemColorAction_test->setStatusTip(tr("Item Color set"));
m_colorButton_test->setDefaultAction(itemColorAction_test);

connect(m_colorButton_test, SIGNAL(colorChanged(const QColor&)), this, SLOT(textColor_test(const QColor&)));
connect(itemColorAction_test, SIGNAL(triggered()), this, SLOT(itemColorChanged_test()));



<pre name="code" class="cpp">void MainWindow::textColor_test(const QColor& col)
{
if (!col.isValid())
return;
scene->setItemColor(col);
}
void MainWindow::itemColorChanged_test()
{
fillAction = qobject_cast<QAction *>(sender());
fillColorToolButton->setIcon(createColorToolButtonIcon(
":/images/floodfill.png",
qvariant_cast<QColor>(fillAction->data())));
fillButtonTriggered();
}
QAction *itemColorAction_test;
PopupColorButton* m_colorButton_test;

<pre name="code" class="cpp">colorToolBtn.h
#ifndef QTN_POPUPCOLORBUTTON_H
#define QTN_POPUPCOLORBUTTON_H

#include <QToolButton>
#include <QStylePainter>
#include <QStyleOptionToolButton>
#include <QMouseEvent>
#include <QColorDialog>

class QStyleOption;

class PopupColorButton : public QToolButton
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
PopupColorButton(QWidget* parent = 0);
virtual ~PopupColorButton();

public:
const QColor& color() const;
void setColor(const QColor& color);

public:
virtual QSize sizeHint() const;

Q_SIGNALS:
void colorChanged(const QColor& color);

protected:
virtual void paintEvent     (QPaintEvent* event);
virtual void mousePressEvent(QMouseEvent* event);

protected:
QColor m_color;
};

#endif // QTN_POPUPCOLORBUTTON_H


colorToolBtn.cpp:

#include "colorToolBtn.h"

PopupColorButton::PopupColorButton(QWidget* parent)
: QToolButton(parent)
{
setPopupMode(MenuButtonPopup);
m_color = Qt::color0;
}

/*!
\brief Destructor of PopupColorButton.
*/
PopupColorButton::~PopupColorButton()
{
}

/*!
\brief Returns the current selected color.
*/
const QColor& PopupColorButton::color() const
{
return m_color;
}

/*!
\brief Sets the specified \a color and select specified color button.
*/
void PopupColorButton::setColor(const QColor& color)
{
if (color != m_color)
{
m_color = color;
update();
}
}

/*! \reimp */
QSize PopupColorButton::sizeHint() const
{
return QToolButton::sizeHint();
}

/*! \reimp */
void PopupColorButton::paintEvent(QPaintEvent* painter)
{
QToolButton::paintEvent(painter);

QStylePainter p(this);

QStyleOptionToolButton opt;
initStyleOption(&opt);

if (opt.icon.isNull())
return;
if (!m_color.isValid())
return;
QRect rect(opt.rect);
QSize sizeIcon = opt.iconSize;

int widthIndicator = style()->pixelMetric(QStyle::PM_MenuButtonIndicator, &opt, this);
rect.setHeight(sizeIcon.height()/5);
rect.adjust(2, 0, -(widthIndicator+4), 0);
rect.translate(0, opt.rect.bottom()-(rect.height()+2));
p.fillRect(rect, m_color);
}

/*! \reimp */
void PopupColorButton::mousePressEvent(QMouseEvent* e)
{
QStyleOptionToolButton opt;
initStyleOption(&opt);
if (e->button() == Qt::LeftButton && (popupMode() == MenuButtonPopup))
{
QRect popupr = style()->subControlRect(QStyle::CC_ToolButton, &opt,
QStyle::SC_ToolButtonMenu, this);
if (popupr.isValid() && popupr.contains(e->pos()))
{
QColor col = QColorDialog::getColor(m_color, this);
if (!col.isValid())
return;

if (col != m_color)
{
m_color = col;
update();
emit colorChanged(m_color);
}
return;
}
}
QToolButton::mousePressEvent(e);
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: