【问题标题】:How do I change qt label text to look like window title text如何将 qlabel 文本更改为看起来像窗口标题文本
【发布时间】:2017-12-08 12:42:47
【问题描述】:

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

这是我想要完成的图像

【问题讨论】:

  • 您可能希望包含一个显示您正在寻找的效果示例的屏幕截图,因为不同的窗口管理器以不同的方式呈现窗口标题。
  • 你试过QLabel的rich-text option了吗?如果启用,QLabel 进程 mark-up(HTML 的子集)。由于 QLabel 是从QFrame 派生的,它还提供了属性来调整各种样式的框架。如果您覆盖style(继承自QWidget),可能会有更多机会,但这超出了我的个人经验。
  • 关于@JeremyFriesner 的评论,我建议看一下QStylePainter(例如QStylePainter::drawComplexControl(Qt::CC_TitleBar, ...),它允许使用活动样式引擎绘制自己的东西。(这就是我们使用的我们自己的 Qt 小部件(扩展)以保持外观同步。与其余部分。)
  • 关于QLabel 和风格,我发现了这个:SO: QLabel: set color of text and background

标签: c++ linux qt user-interface qlabel


【解决方案1】:

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

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 中编译并测试了它。下图:

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多