c++ - 是否可以从子类和父类中绘制 QWidget?

标签 c++ qt5 qwidget qpainter

问题

我想创建一个具有以下元素的按钮小部件:

  • 可配置的背景颜色
  • 按钮大小的透明图标
  • 可配置的定位文本

因为我更喜欢 QPushButton 而不是 QToolButton,所以我面临图标/文本的已知问题(参见 herehere)对齐方式。

所以我的方法是专门化QPushButton 类并覆盖paintEvent 方法(参见下面的代码)。如果我只需要手动绘制文本并将其余部分(图标和背景)留给父类,那就太好了。但是,它现在似乎还没有绘制文本。

这可能吗,我的错误在别的地方,还是我必须自己画?

代码

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 位置写入了文本,并且显示如下:

The button when text "HelloWorld" painted at 0,0 location

因此,如果您看到,文本已绘制,但它超出了按钮的尺寸,因此您看不到它。

关于c++ - 是否可以从子类和父类中绘制 QWidget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856407/

相关文章:

c++ - 从 Qt Designer 将 QWidget 提升为 QMainWindow 或将 QMainWindow 添加到 QWidget

c++ - std::string 不适用于 std::set

c++ - 我应该为这个艺术项目使用哪个 IDE?

c++按值传递模板化unique_ptr

c++ - 错误 =>/usr/bin/ld: 找不到 -lQt5::Core -lQt5::Gui -lQt5::Test -lQt5::Concurrent -lQt5::OpenGL

qt - QWidget setStyleSheet 支持哪种 CSS 标准?

c++ - QTest覆盖涂料法

c++ - 没有明显拷贝的复制构造函数错误

Qt 5 为 XCB 使用 EGL 后端

c++ - QObject::connect:没有此类信号-QT和OpenCV SIGNAL以及connect()错误