QT重写控件并使用,圆形头像示例

QT重写控件类,并在designer中拖动控件后使用

**

重写label类

**

相信大家在使用QT designer拖动控件的时候会发现控件十分的丑陋,那么如何让自己界面中的控件更加的美观呢?其实只要重写一个控件类,就可以完美的解决这个问题。

这里我们以继承原有的label类并重写为例子

  1. CRoundLabel::CRoundLabel(QWidget *parent):QLabel(parent)
    在第一步的时候要继承原有的label类,之后才能够对新的类进行操作
  2. 重绘label,这里给它变成了圆形的形状,可以用作头像的控件或者其他

QT重写控件并使用,圆形头像示例_第1张图片
这是通过拖拽直接生成的label,虽然可以给它添加一个图片,但是最终的效果却也只能做到这样:
QT重写控件并使用,圆形头像示例_第2张图片
害,是不是方方正正,没有一点美感,那么重写了label之后会有什么样的效果呢?
在这里插入图片描述
没错,中间那个圆圆的就是我们修改好的label!!当然,这里也只是做了一部分修改,大佬们使用的时候可以根据自己的需要给控件重绘。接下来上代码,代码中还有一些鼠标点击前后的操作,这里就不一一细说了。

// .h文件
#ifndef ROUNDLABEL_H
#define ROUNDLABEL_H
#include <QLabel>
class CRoundLabel:public QLabel
{
    Q_OBJECT
public:
    CRoundLabel(QWidget* parent=0);
signals:
    void sigClick();
protected:
    void paintEvent(QPaintEvent *e);
    void enterEvent(QEvent* event);
    void leaveEvent(QEvent *event);
    void mousePressEvent(QMouseEvent *ev);
private:
    bool m_bTransLayer; //透明层
};
#endif

以上是头文件中的内容,有一些不需要用到的可以自行删除

//.cpp
#include "roundlabel.h"
#include 
CRoundLabel::CRoundLabel(QWidget *parent):QLabel(parent)
{
    m_bTransLayer = false;
}
void CRoundLabel::paintEvent(QPaintEvent *e)
{
    if(NULL != pixmap())
    {
       QPainter painter(this);
       painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
       QPainterPath path;
       int round = qMin(width(), height());
       path.addEllipse(0, 0, round, round);
       painter.setClipPath(path);
       painter.drawPixmap(-1, -1, width()+2, height()+2, *pixmap());
       if(m_bTransLayer)
       {
            //鼠标在label上,加载透明图片
            QPixmap pixMap(":/new/prefix/001.jpg");
            painter.drawPixmap(-1, -1, width()+2, height()+2, pixMap);
       }
    }
    else
    {
       QLabel::paintEvent(e);
    }
}
void CRoundLabel::enterEvent(QEvent *event)
{
    m_bTransLayer = true;
    update();//刷新label
}
void CRoundLabel::leaveEvent(QEvent *event)
{
    m_bTransLayer = false;
    update();//刷新label
}
void CRoundLabel::mousePressEvent(QMouseEvent *ev)
{   //鼠标单击消息
    emit sigClick();
}

使用我们的控件类

label我们已经重写了,那么究竟要怎么使用它呢?其实只需要在我们拖动的控件中,将其提升为我们所写的类就可以了,以下是详细操作:

  1. 拖动拉出来一个labelQT重写控件并使用,圆形头像示例_第3张图片
    这时候我们如果运行就可以发现,新拖出来的这个控件还是原来的样式,那么我们写好的label类怎么用呢?很简单,接着往下看
  2. 将新拖过来的label提升为我们所写的类,点击label,右键提升为:QT重写控件并使用,圆形头像示例_第4张图片
    确认提升之后我们会发现,这个label的类变成了我们所写的label,而非是其他普通的labelQT重写控件并使用,圆形头像示例_第5张图片
    以上便是重写后我们自己类的使用方法。
    (…/…/…/…/…/…/…/…/…这是无情的分割线…/…/…/…/…/…/…/…)
    #####最后,本人也是刚刚接触QT,对于各种方法的使用也是在摸索,各位大佬如果有更好的处理方法可以在评论区讨论!

你可能感兴趣的:(qt)