[英]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)
题:
我在网上看到了其他示例项目,其中包括带有文件夹结构的自定义控件,如此处所示,它是较大项目中的子文件夹。 他们如何创建此文件夹结构及其文件集?
作为额外的好处,如果有人希望向我展示我的h和cpp文件的预览/伪代码,这些代码将像pyside代码一样覆盖QLabel的paint事件。
注意:作为建议,请勿使用Q前缀来命名类,因为这可能会引起混乱。
paintEvent
paintEvent
,然后在xxx.cpp中选择“ 重构”->“添加定义” 一旦您知道两种语言的语法,翻译就应该非常简单。
为了帮助您完成此过程,我准备了一个示例,说明如何将您的代码转换为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);
}
注意:在翻译代码并省略或注释部分后,我也可以自由修改代码,这不是必需的。
在提供的示例应用程序中使用时,此类产生类似的结果:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.