是否可以同时从子级和父级 class 绘制 QWidget?
Is it possible to paint QWidget both from child & parent class?
问题
我想创建一个具有以下元素的按钮小部件:
- 可配置的背景颜色
- 按钮大小的透明图标
- 可配置的定位文本
由于我更喜欢 QPushButton
而不是 QToolButton
,因此我面临 icon/text 对齐的已知问题(请参阅 here and here)。
所以我的方法是专门化 QPushButton
class 并覆盖 paintEvent
方法(参见下面的代码)。如果我只需要手动绘制文本并将其余部分(图标和背景)留给父 class 就好了。不过现在好像还没有绘制文字。
这可能吗,我的错误在别处,还是我必须自己画?
代码
class MyPushButton : public QPushButton
{
public:
MyPushButton() : QPushButton() {}
virtual ~MyPushButton() = default;
protected:
virtual void paintEvent(QPaintEvent* e) override {
QPushButton::paintEvent(e);
QPainter p(this);
p.drawText(0,0, "label");
}
};
当然可以:
这里MyPushButton是从QPushButton派生出来的。
void MyPushButton::paintEvent( QPaintEvent *e )
{
// This will draw everything on the push button with default palette.
QPushButton::paintEvent(e);
// Anything draw past this statement will be drawn over the real
// push button with all its properties intact,
// if you won't draw anything over, your pushbutton will look like QPushButton
// Now draw your custom content here:
}
编辑 1:
试试这个,用一个矩形来告诉在哪里画:
虽然我不知道为什么它不适用于点。
class MyPB : public QPushButton
{
protected:
void paintEvent( QPaintEvent *e ) override
{
// This will draw everything on the push button with default palette.
QPushButton::paintEvent(e);
p.drawText( QRect( 0,0, 50, 50 ), "HelloWorld" );
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyPB pb;
pb.show();
return a.exec();
}
编辑 2:
它也适用于点,它已经按照设计进行了。
因此,它确实在 0,0 位置写入了文本,并且显示如下:
因此,如果您看到,文本已绘制,但它超出了按钮的尺寸,因此您看不到它。
问题
我想创建一个具有以下元素的按钮小部件:
- 可配置的背景颜色
- 按钮大小的透明图标
- 可配置的定位文本
由于我更喜欢 QPushButton
而不是 QToolButton
,因此我面临 icon/text 对齐的已知问题(请参阅 here and here)。
所以我的方法是专门化 QPushButton
class 并覆盖 paintEvent
方法(参见下面的代码)。如果我只需要手动绘制文本并将其余部分(图标和背景)留给父 class 就好了。不过现在好像还没有绘制文字。
这可能吗,我的错误在别处,还是我必须自己画?
代码
class MyPushButton : public QPushButton
{
public:
MyPushButton() : QPushButton() {}
virtual ~MyPushButton() = default;
protected:
virtual void paintEvent(QPaintEvent* e) override {
QPushButton::paintEvent(e);
QPainter p(this);
p.drawText(0,0, "label");
}
};
当然可以:
这里MyPushButton是从QPushButton派生出来的。
void MyPushButton::paintEvent( QPaintEvent *e )
{
// This will draw everything on the push button with default palette.
QPushButton::paintEvent(e);
// Anything draw past this statement will be drawn over the real
// push button with all its properties intact,
// if you won't draw anything over, your pushbutton will look like QPushButton
// Now draw your custom content here:
}
编辑 1: 试试这个,用一个矩形来告诉在哪里画: 虽然我不知道为什么它不适用于点。
class MyPB : public QPushButton
{
protected:
void paintEvent( QPaintEvent *e ) override
{
// This will draw everything on the push button with default palette.
QPushButton::paintEvent(e);
p.drawText( QRect( 0,0, 50, 50 ), "HelloWorld" );
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyPB pb;
pb.show();
return a.exec();
}
编辑 2: 它也适用于点,它已经按照设计进行了。 因此,它确实在 0,0 位置写入了文本,并且显示如下:
因此,如果您看到,文本已绘制,但它超出了按钮的尺寸,因此您看不到它。