首页 > 解决方案 > 在 Windows (OS) 中的 QListView 上没有正确省略

问题描述

我使用两种操作系统(windows 和 linux)和 linux(图 1)ElideRight 运行良好,但在 windows(图 2)中运行不佳。(...) 应该是“a”。

我将下面的代码用于“Eliding”。

您还需要知道,这发生在 QListView 中。

ui->geometry_list->setTextElideMode(Qt::ElideRight);

linux端列表

Windows 端的列表

标签: c++qtuser-interface

解决方案


我尝试使用以下MCVE testQListViewElide.cc重现 OPs 问题:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QListWidget qLst;
  qLst.resize(200, 200);
  qLst.setTextElideMode(Qt::ElideRight);
  qLst.addItem(QString("A very long item text to make the elide feature visible"));
  qLst.show();
  // runtime loop
  return app.exec();
}

我的平台是 Windows 10 上的 Visual Studio 2019。

输出:

Qt Version: 5.15.1

testQListViewElide.exe 的快照

实际上没有椭圆。但是……请注意水平滚动条。

所以,我添加了一行来关闭滚动条:

  qLst.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

输出:

testQListViewElide.exe 的快照(不带滚动条)

所以,这通常在 Windows 中工作。(如果不是,我会感到惊讶。)


OP声称à显示的是an而不是省略号让我有点怀疑。这可能是编码问题的征兆。然而,由于 Qt 使用 Unicode,QString此类问题不太可能发生。(在日常业务中使用 Windows 中的 Qt 进行开发时,我从未遇到过此类问题。)

只是,出于好奇,我将(224 = ) 的Windows 1252编码与椭圆的 Unicode (U+2026) 进行了比较,UTF-8 编码:,UTF-16 编码:(LE) 或(BE)。à0xE0e2 80 a626 2020 26

这看起来不像是错误解释的编码——至少,不明显。但是,为了解决这个问题,OP 必须提供更多信息,例如MCVE,这使得问题可重现。(因此,无论它是否在 OPs 平台上重现问题,OP 都可以使用我的 MCVE。)

我怀疑这是一个编码问题,但发生在项目文本存储在QStrings 中时。它只是暴露了损坏的项目文本的列表视图。因此,考虑到在 Linux 中检索到的字符串很可能已经采用 UTF-8 编码。如果 aQString是从 a 分配的std::string,则也假定为 UTF-8 编码。(QString::fromStdString())。

这在内部编码为 UTF-16 的 Windows 中有所不同,但这些 ANSI 风格的系统函数(根据当前代码页具有不同的字符值含义)仍然可用(这对于任何编码损坏总是有益的)。


推荐阅读