gpt4 book ai didi

c++ - 如何将 qlabel 文本更改为看起来像窗口标题文本

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:08 25 4
gpt4 key购买 nike

在我的程序中,我显示了一个对话窗口来向用户提供信息。我正在使用 QT Label 元素来执行此操作,我想让文本看起来更“有机”或雕刻,就像窗口的标题文本,而不是简单的灰色黑色。有没有人有什么建议?我正在使用 QT Creator 并使用适用于 Linux 的 C++ 进行编码。

这是我正在尝试完成的图片

enter image description here

最佳答案

我准备了一个 MCVE展示我在评论中建议的选项。

改变 QLabel 的样式非常简单直接。

使用 QStylePainter与我实际预期的不太相符。我在示例代码中留下了到目前为止得到的内容。 (也许有人可以留下有用的提示。)我稍后会调查这个主题,并在我在这个主题上取得令人满意的进展后立即编辑这个答案。

示例代码:

#include <QtWidgets>

class TitleBar: public QWidget {

private:
QStyleOptionTitleBar _option;
//QString _text;

public:
explicit TitleBar(
const QString &text = QString(), QWidget *pQParent = nullptr);

protected:
virtual QSize sizeHint() const;
virtual void resizeEvent(QResizeEvent *pQEvent);
virtual void paintEvent(QPaintEvent *pQEvent);
};

int main(int argc, char **argv)
{
qDebug() << "Qt Version: " << QT_VERSION_STR;
// main application
#undef qApp // undef macro qApp out of the way
QApplication qApp(argc, argv);
// setup of GUI
QWidget qWin;
QVBoxLayout qBox;
// a boring label
QLabel qLbl1(QString::fromUtf8("Rather boring"));
qLbl1.setAlignment(Qt::AlignCenter);
qBox.addWidget(&qLbl1);
// a label with frame
QLabel qLbl2(QString::fromUtf8("Label with Frame"));
qLbl2.setFrameStyle(QLabel::Panel | QLabel::Raised);
qLbl2.setLineWidth(2);
qLbl2.setAlignment(Qt::AlignCenter);
qBox.addWidget(&qLbl2);
// a label with rich-text
QLabel qLbl3(
QString::fromUtf8(
"<body bgcolor='#28f'>" // doesn't have the effect
"<font size='+2' color='#f8e' face='Old English Text MT'>"
"Label <i>with</i> <b>Rich-Text</b>"
"</font>"
"</body>")); // background is set by style-sheet instead
qLbl3.setTextFormat(Qt::RichText); // might be auto-detected...
qLbl3.setStyleSheet("QLabel { background-color: #28f; }");
qLbl3.setAlignment(Qt::AlignCenter);
qLbl3.show();
qBox.addWidget(&qLbl3);
// a home-brew title bar
TitleBar qTitle("A Home-Brew Title Bar");
qBox.addWidget(&qTitle);
// finish setup of GUI
qWin.setLayout(&qBox);
qWin.show();
// run application
return qApp.exec();
}

TitleBar::TitleBar(const QString &text, QWidget *pQParent):
QWidget(pQParent)
{
_option.initFrom(this);
_option.titleBarFlags = Qt::Window;
_option.text = text;
}

QSize TitleBar::sizeHint() const
{
#if 0 // does not provide the expected result
return _option.rect.size();
#elif 0 // does not provide the expected result
return style()->proxy()->subControlRect(QStyle::CC_TitleBar,
&_option, QStyle::SC_TitleBarLabel).size();
#else
return QSize(0,
style()->proxy()->pixelMetric(QStyle::PM_TitleBarHeight,
&_option, this));
#endif // 0
}

void TitleBar::resizeEvent(QResizeEvent *pQEvent)
{
_option.rect = QRect(_option.rect.topLeft(), pQEvent->size());
}

void TitleBar::paintEvent(QPaintEvent *pQEvent)
{
QPainter qPainter(this);
style()->proxy()->drawComplexControl(QStyle::CC_TitleBar,
&_option, &qPainter, this);
}

我在 Windows 10(64 位)上的 VS2013 中编译和测试了它。快照下方:

Snapshot of testQLabelStyled

关于c++ - 如何将 qlabel 文本更改为看起来像窗口标题文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44916188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com