C++ 如何在Qt中的正确区域(考虑样式表)中绘制文本?

C++ 如何在Qt中的正确区域(考虑样式表)中绘制文本?,c++,c,qt,C++,C,Qt,我试图删除QLabel(子类化为标签)中的文本。问题在于自定义的paintEvent()不尊重样式表设置的变量(尤其是填充/边距)。我该如何解决这个问题 正如你所看到的,我有一个解决方案,它做的大部分事情都是正确的,但是边距不能正常工作。另一个解决方案远未奏效,但方向是正确的。我知道我需要使用QStyle来获得区域的大小,但我不明白。文档真的很混乱 void Label::paintEvent(QPaintEvent *event){ if (this->elide == Qt::

我试图删除
QLabel
(子类化为标签)中的文本。问题在于自定义的
paintEvent()
不尊重样式表设置的变量(尤其是填充/边距)。我该如何解决这个问题

正如你所看到的,我有一个解决方案,它做的大部分事情都是正确的,但是边距不能正常工作。另一个解决方案远未奏效,但方向是正确的。我知道我需要使用
QStyle
来获得区域的大小,但我不明白。文档真的很混乱

void Label::paintEvent(QPaintEvent *event){
    if (this->elide == Qt::ElideNone){
        QLabel::paintEvent(event);
        return;
    }

    QPainter p(this);
    QFontMetrics fm(font());
    if (fm.width(text()) > contentsRect().width()) {
        if (1){ //this kind of works...
            QRect rect = this->contentsRect();
            rect.adjust(this->margin(), this->margin(), -this->margin(), -this->margin());
            QString elided_txt = this->fontMetrics().elidedText(text(), this->elide, rect.width(), Qt::TextShowMnemonic); //This is the key line.

            p.drawText(rect(), elided_txt, QTextOption(Qt::AlignVCenter | Qt::AlignLeft));
        } else { //the correct solution should look something like this:


            QStyle *style = this->style();

            QRect rect = style->itemTextRect(fm, this->rect(), Qt::AlignVCenter | Qt::AlignHCenter, true, this->text());

            QString elided_txt = this->fontMetrics().elidedText(text(), this->elide, rect.width(), Qt::TextShowMnemonic); //This is the key line.

            style->drawItemText(&p, this->rect(), Qt::AlignVCenter | Qt::AlignLeft, this->palette(), true, elided_txt);
        }
    } else {
        QLabel::paintEvent(event);
    }
}

你找到解决这个问题的办法了吗?我有一个类似的问题,看到了吗