【问题标题】:Creating subclass of QLabel in Qt Creator using C++使用 C++ 在 Qt Creator 中创建 QLabel 的子类
【发布时间】:2019-02-16 00:24:09
【问题描述】:

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

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

我在 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 的绘制事件,作为额外的奖励。

【问题讨论】:

  • 您是在问如何在 Qt creator 中创建一个新项目吗?第一个问题完全不清楚。
  • 我几乎准备好了示例代码。给我一点时间来完成并测试它。
  • @Jaa-c 我在问如何在我当前的项目中创建一个子文件夹,其中子文件夹包含 pri 文件以及标题和源文件夹。
  • @JokerMartini 我以为你的问题是“在 Qt Creator 中创建 QLabel 的子类”
  • 您的问题与您提供的代码无关,这造成了混乱。请澄清您的要求(可能通过删除任何不相关的内容)。具体来说,您有一些信息、一个代码示例,然后是一个不相关的问题。

标签: c++ qt


【解决方案1】:

解决方案

  1. 在 Qt creator 中添加一个新类到您的项目中,转到 File->New File 或 Project->C++->C++ Class。从下拉菜单中使类继承自 QWidget。选择一个子文件夹并为类命名

注意:作为一条建议,不要以 Q 前缀命名您的类,因为这可能会导致混淆。

  1. 在标头中将基类和包含替换为 QLabel
  2. 在基类名称上右击选择Refactor->Insert Virtual Functions of Base Classes,添加paintEvent
  3. 右击paintEvent并选择Refactor->Add Definition in 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 上找到。

结果

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

【讨论】:

  • 当您说选择子文件夹时,您建议我做什么。你的意思是我项目根目录中的一个文件夹,叫做 CustomControls 吗?您设法以准确的答复和详细信息回答了我所有的问题,我非常感谢您的帮助。我认为这对我想做的事情有很大帮助。非常感谢。
  • @JokerMartini,不客气。至于子文件夹,我的意思是当创建一个新类时,可以设置一个路径,并且您可以选择您的类相对于项目的其余部分所在的位置。但由于确切的文件夹结构受个人喜好以及项目要求和细节的影响,我无法在此提出好的建议。
  • 其次添加受保护的时候:void paintEvent(QPaintEvent *event);您怎么知道将以下单词 (override) 添加到受保护的方法中?它没有自动出现。
  • @JokerMartini,对话窗口上有一个复选框:Add override equivalent...
  • 非常感谢。如果我对一些事情还有其他问题,您是否有推荐的沟通表格,而不是冗长的聊天?
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多