2017-04-03 85 views
0
//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对象时,圆圈消失。如何在QPushButton点击位置绘制一个形状?

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

回答

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

的方法您实现是paintEvent,在doPainting必须更改标志,并调用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(); 
} 
+0

click事件已经调用控件重绘 –