繁体   English   中英

使用C ++在Qt Creator中创建QLabel的子类

[英]Creating subclass of QLabel in Qt Creator using C++

我最近刚接触c ++世界。 我的背景主要是python和一些特定于应用程序的脚本语言。 任何人,我都希望得到一些常规反馈,并转换我用pyside编写的QLabel的子类,并将其转换为可与Qt Creator中的C ++应用程序一起使用。 我不是在找人为我做整个项目。 我只需要一些有关如何在Qt项目中添加/设置自定义控件的指南。

您会注意到在我的子类中,我只是覆盖了标签的paint事件,以创建虚线图案来填充标签右侧的空白处,如下所示:

在此处输入图片说明

我在Pyside中的自定义标签的代码:

class QLabelHeader(QtWidgets.QLabel):

    def __init__(self, parent=None, **kwargs):
        super(QLabelHeader, self).__init__(parent)   

    # events
    def paintEvent(self, event):
        # calculate font width
        metrics = QtGui.QFontMetrics(self.font())
        text_width = metrics.boundingRect(self.text()).width()

        # calculate dimensions
        y = int(self.height() * 0.5 - 2)
        x = text_width + 4
        width = self.width() - x

        # create pattern
        px = QtGui.QPixmap(4,4)
        px.fill(QtCore.Qt.transparent)
        pattern_painter = QtGui.QPainter(px)
        pattern_painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
        pattern_painter.setBrush(QtGui.QBrush(QtGui.QColor(200,200,200), QtCore.Qt.SolidPattern))
        pattern_painter.drawRect(0,0,1,1)
        pattern_painter.drawRect(2,2,1,1)
        pattern_painter.end()

        # draw tiled pixmap
        painter = QtGui.QPainter(self)
        painter.drawTiledPixmap(x,y,width,5,px) 
        painter.end()

        super(QLabelHeader, self).paintEvent(event)

题:

  1. 我在网上看到了其他示例项目,其中包括带有文件夹结构的自定义控件,如此处所示,它是较大项目中的子文件夹。 他们如何创建此文件夹结构及其文件集?

  2. 作为额外的好处,如果有人希望向我展示我的h和cpp文件的预览/伪代码,这些代码将像pyside代码一样覆盖QLabel的paint事件。

在此处输入图片说明

  1. 将新类添加到Qt创建器中的项目中,然后转到File-> New File或Project-> C ++-> C ++ Class 从下拉菜单的QWidget继承类。 选择一个子文件夹并给该类命名

注意:作为建议,请勿使用Q前缀来命名类,因为这可能会引起混乱。

  1. 在标头中用QLabel替换基类和include
  2. 右键单击基类的名称,然后选择“ 重构”->“插入基类的虚函数”并添加paintEvent
  3. 右键单击paintEvent ,然后在xxx.cpp中选择“ 重构”->“添加定义”
  4. 转到定义并将您的代码放在此处

一旦您知道两种语言的语法,翻译就应该非常简单。

为了帮助您完成此过程,我准备了一个示例,说明如何将您的代码转换为C ++:

LabelHeader.h

#ifndef LABELHEADER_H
#define LABELHEADER_H

#include <QLabel>

class LabelHeader : public QLabel
{
    Q_OBJECT
public:
    explicit LabelHeader(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;
};

#endif // LABELHEADER_H

LabelHeader.cpp

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

LabelHeader::LabelHeader(QWidget *parent) :
    QLabel(parent)
{

}

void LabelHeader::paintEvent(QPaintEvent *event)
{
    // calculate font width
    QFontMetrics metrics(font());
    int text_width = metrics.boundingRect(text()).width();

    // calculate dimensions
    int y = height() * 0.5 - 2;
    int x = text_width + 4;
    int w = width() - x;

    // create pattern
    QPixmap px(4, 4);
    px.fill(Qt::transparent);

    QPainter pattern_painter(&px);

    pattern_painter.setPen(Qt::NoPen);
    pattern_painter.setBrush(QBrush(QColor(200, 200, 200), Qt::SolidPattern));
    pattern_painter.drawRect(0, 0, 1, 1);
    pattern_painter.drawRect(2, 2, 1, 1);
//  pattern_painter.end();

    // draw tiled pixmap
    QPainter painter(this);

    painter.drawTiledPixmap(x, y, w, 5, px);
//  painter.end();

    QLabel::paintEvent(event);
}

注意:在翻译代码并省略或注释部分后,我也可以自由修改代码,这不是必需的。

该示例的完整代码可在GitHub找到

结果

在提供的示例应用程序中使用时,此类产生类似的结果:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM