如何正确地向自定义控件添加属性,该属性在更改后会触发绘画事件?该属性仅接受整数值0、1或2。
该属性的设置器称为 setPattern ,因此示例用法为 setPattern(0)。
此属性值最终将用于控制在绘画事件中绘制的图案。
labelheader.h
#ifndef LABELHEADER_H
#define LABELHEADER_H
#include <QLabel>
class LabelHeader : public QLabel
{
Q_OBJECT
public:
explicit LabelHeader(QWidget *parent = nullptr);
explicit LabelHeader(const QString &text, QWidget *parent = nullptr);
signals:
public slots:
// QWidget interface
protected:
void paintEvent(QPaintEvent *event);
};
#endif // LABELHEADER_H
labelheader.cpp
#include "labelheader.h"
#include <QPainter>
LabelHeader::LabelHeader(QWidget *parent) :
QLabel(parent)
{
}
LabelHeader::LabelHeader(const QString &text, QWidget *parent) :
QLabel(text, parent)
{
}
void LabelHeader::paintEvent(QPaintEvent *event)
{
// calculate font width
QFontMetrics metrics(font());
int text_width = metrics.boundingRect(text()).width();
// calculate dimensions
int y = height() * 0.5;
int x = text_width + 4;
// create pattern
QPixmap px(4, 4);
px.fill(Qt::transparent);
QPainter pattern_painter(&px);
// Create ashed 3 dots
pattern_painter.setPen(Qt::NoPen);
pattern_painter.setBrush(QBrush(palette().color(QPalette::WindowText), Qt::SolidPattern));
pattern_painter.drawRect(0, 0, 1, 1);
pattern_painter.drawRect(2, 2, 1, 1);
// draw
QPainter painter(this);
// Draw dashed 3 dots
painter.drawTiledPixmap(x, y-2, width()-x, 5, px);
// Draw solid line
//painter.drawLine(x,y,width(),y);
QLabel::paintEvent(event);
}
答案 0 :(得分:3)
您只需在设置器中调用update()
。如果您只想接受有限范围内的值,则可以将其限制在setter中或使用枚举而不是int。
#include <QLabel>
class LabelHeader : public QLabel
{
Q_OBJECT
public:
Q_PROPERTY(Pattern pattern READ(getPattern) WRITE(setPattern))
enum Pattern { FIRST = 0, SECOND, THIRD };
Q_ENUM(Pattern)
...
void setPattern(Pattern value)
{
if (pattern != value)
{
pattern = value;
update();
}
}
Pattern getPattern() const { return pattern; }
...
private:
Pattern pattern { FIRST };
};
答案 1 :(得分:2)
这就是我的方法。注意:我尚未在“库”中编写实际的自定义控件,通常只使用“升级的小部件”。
头文件:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QObject>
#include <QWidget>
class MyWidget: public QWidget
{
Q_OBJECT
Q_PROPERTY(int value READ value WRITE setValue)
private:
int m_value;
public:
MyWidget(QWidget *parent=0);
inline int value() const {return m_value;}
void setValue(int value);
signals:
void valueChanged();
};
#endif // MYWIDGET_H
源文件:
#include "MyWidget.h"
MyWidget::MyWidget(QWidget *parent)
:QWidget(parent)
{
m_value = 0;
}
void MyWidget::setValue(int value)
{
if (m_value == value) return;
m_value = value;
emit valueChanged();
update(); // This will cause repaint
}