如何在点击QPushButton的位置绘制一个形状?

时间:2017-04-03 15:47:13

标签: c++ qt qt5

//oneLed.h
#pragma once

#include<QPushButton>

class oneLed :public QPushButton
{
    Q_OBJECT

public:
    oneLed(QWidget* parent = 0);
protected:
    void doPainting();
};
#include"oneLed.h"
#include<QPainter>
oneLed::oneLed(QWidget* parent)
    :QPushButton(parent)
{
    connect(this, &QPushButton::clicked, this, &oneLed::doPainting);
}

void oneLed::doPainting()
{
        QPainter painter(this);
        //painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(QPen(QBrush("#888"), 1));
        painter.setBrush(QBrush(QColor("#888")));
        painter.drawEllipse(0, 0, this->width(), this->height());
        //painter.drawEllipse(0, 0, 30, 30);

}
//main.cpp
#include"oneLed.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    oneLed w;
    w.resize(100, 500);
    w.show();
    return a.exec();
}

我想达到以下效果: 当我单击oneLed对象时,圆圈会出现在单个对象的位置。当我再次点击oneLed对象时,圆圈消失。

但实际上当我点击oneLed对象时,圆圈不会出现。

2 个答案:

答案 0 :(得分:1)

我猜你错了。您的代码中会发生什么:

  • 单击该按钮并调用您的doPainting插槽
  • 你做自定义绘画
  • 实际的按钮绘制事件由Qt主事件循环触发并覆盖您的绘画

您需要覆盖paintEvent方法。

在自定义插槽中,引发一个布尔标志,指示按钮已被按下。

void oneLed::slotClicked()
{
    m_clicked = !m_clicked;
}

然后做这样的事情:

void oneLed::paintEvent(QPaintEvent *event)
{
    // first render the Qt button
    QPushButton::paintEvent(event);
    // afterward, do custom painting over it
    if (m_clicked)
    {
        QPainter painter(this);
        painter.setPen(QPen(QBrush("#888"), 1));
        painter.setBrush(QBrush(QColor("#888")));
        painter.drawEllipse(0, 0, this->width(), this->height());
    }
}

答案 1 :(得分:1)

您实施的方法是paintEvent,在doPainting您必须更改标记并调用update()方法的广告位中。

重要update方法调用paintEvent

<强> oneLed.h

#ifndef ONELED_H
#define ONELED_H

#include <QPushButton>

class oneLed : public QPushButton
{
    Q_OBJECT
public:
    oneLed(QWidget* parent = 0);

protected:
    void paintEvent(QPaintEvent * event);

private slots:
    void doPainting();

private:
     bool state;
};

#endif // ONELED_H

<强> oneLed.cpp

#include "oneled.h"
#include <QPainter>

oneLed::oneLed(QWidget *parent):QPushButton(parent)
{
    state = false;
    connect(this, &QPushButton::clicked, this, &oneLed::doPainting);
}

void oneLed::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event);
    if(state){
        QPainter painter(this);
        //painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(QPen(QBrush("#888"), 1));
        painter.setBrush(QBrush(QColor("#888")));
        painter.drawEllipse(0, 0, width(), height());
    }

}

void oneLed::doPainting()
{
    state = !state;
    update();
}