Qt字体下划线无法正确显示

时间:2018-02-18 10:17:28

标签: qt fonts qt-designer

当我对包含中文和英文的按钮文本使用下划线并使用英文字体系列时,下划线无法完全显示。 Qt-Designer的使用也可以表明这种现象。

enter image description here

这是Qt Designer中的一个按钮,字体系列为Arial。

我不知道为什么以及如何解决这个问题。 任何人都有好主意?

1 个答案:

答案 0 :(得分:0)

我从一个MCVE开始,因为我很好奇我是否可以在我身边重现你的问题(Window 10 - 64 Bit)。

所以,这是testQPushButtonUnderline.cc

// Qt header:
#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << QT_VERSION_STR;
  // main application
  QApplication app(argc, argv);
  // setup GUI
  const QString qTxt(
    QString::fromUtf8("\xe4\xb8\xad\xe6\x96\x87""English"));
  QPushButton qBtn(qTxt);
  QFont qFont = qBtn.font();
  qFont.setUnderline(true);
  qBtn.setFont(qFont);
  qBtn.show();
  // run application
  return app.exec();
}

在VS2013中编译和测试:

Snapshot of testQPushButtonUnderline.exe

哎哟!我必须承认我并不期待它。所以,我开始使用其他小部件(QLabelQTextEdit)进行调查:

Snapshot of testQWidgetsUnderline.exe

正如预期的那样,它似乎是&#34; Qt Rich Text Rendering Engine&#34;这有点破碎了。 (看起来中国的字形不被认为是在下划线中强调的。)

我认为这可能会被报告为The Qt Company的错误。

我想了解一下渲染引擎如何确保默认字体(在我的情况下 - Qt默认设置,Windows 10默认设置)包含必要的字形。如果他们必须转到某个地方&#34;引擎盖下怎么办?获取所有必需的字形,由此一些错误会影响渲染错误。猜测,猜测......

然而,这让我想到提供一种绝对具有所需字形的字体。我在Windows charmap实用程序中找到了一个(我在任务栏上总是有这个实用程序)并找到了Microsoft JhengHei

更新后的testQPushButton.cc

// Qt header:
#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << QT_VERSION_STR;
  // main application
  QApplication app(argc, argv);
  // setup GUI
  const QString qTxt(
    QString::fromUtf8("\xe4\xb8\xad\xe6\x96\x87""English"));
  QPushButton qBtn(qTxt);
  QFont qFont = qBtn.font();
  qFont.setFamily(QString::fromLatin1("Microsoft JhengHei"));
  qFont.setUnderline(true);
  qBtn.setFont(qFont);
  qBtn.show();
  // run application
  return app.exec();
}

编译并测试(再次在VS2013中):

Snapshot of fixed testQPushButtonUnderline.exe

哈!

出于好奇,我试图在cygwin中重现此问题。 (我的cygwin中的Qt库安装了cygwin设置。在VS2013中,我使用Qt库代替由合作实验室为我们的专业工作编译。纯粹的意识是他们有相同的版本。)

$ cat >testQPushButtonUnderline.pro <<'EOF'
> SOURCES = testQPushButtonUnderline.cc
> 
> QT += widgets
> EOF

$ qmake-qt5 testQPushButtonUnderline.pro 

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQPushButtonUnderline.o testQPushButtonUnderline.cc
g++  -o testQPushButtonUnderline.exe testQPushButtonUnderline.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQPushButtonUnderline    
5.9.2

Snapshot of testQPushButtonUnderline (before fix) in cygwin

顺便说一下。在cygwin中,它看起来完全相同 我的上述修复。我并不关心这一点,因为{x}可能在cygwin的X11系统中找不到Microsoft JhengHei因此被忽略了。