【发布时间】:2022-08-11 22:24:29
【问题描述】:
我们最近将一个项目从 Qt 4.8 移植到 Qt 5.15(由于依赖关系,Qt 6 还不是我们的选择)。
我们发现当一个项目的文本包含斜杠时,我们所有的 QTableView 都会表现得很奇怪。 这是一个演示 2 个问题的小程序:
#include <QTableWidget>
#include <QAbstractItemModel>
#include <QApplication>
#include <QDebug>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QTableWidget tbl;
tbl.setTextElideMode(Qt::ElideLeft);
tbl.setColumnCount(2);
tbl.setRowCount(argc-1);
for (int i = 1; i < argc; ++i)
{
tbl.setItem( i-1, 0, new QTableWidgetItem(QString::number(i)) );
tbl.setItem( i-1, 1, new QTableWidgetItem(argv[i]) );
}
tbl.show();
auto* pModel = tbl.model();
QString qstrMatch = \"*single*file*\";
QModelIndexList lst = pModel->match(pModel->index(0,1), Qt::DisplayRole, qstrMatch, -1, Qt::MatchWildcard);
qDebug() << lst.size() << \"results\";
for (const QModelIndex& idx : lst)
{
qDebug() << argv[1+idx.row()];
}
return app.exec();
}
假设我们使用以下 4 个字符串运行该程序:
/path/to/design/patterns/singleton_file.txt
/path/to/design/patterns/observer_file.txt
just_single_name_file_no_path.txt
drill a single 1/4 inch hole then file here
1) 文本省略
在 Qt 4 中,Qt::ElideLeft 在所有情况下都受到尊重:
但在 Qt 5 中,每当文本包含斜杠时似乎都会出现问题:
一位同事注意到一个表仍在按预期工作,并发现它的不同之处在于使用了自定义委托。
果然,只需在其他表上执行tbl.setItemDelegate(new QItemDelegate) 也可以解决他们的问题。
但这似乎没有任何意义。
2)文本匹配
在 Qt 4 中,对 match 函数的调用确实会返回 3 个结果,如预期的那样。
在 Qt 5 中,它只返回 1 个结果 - 对于不包含斜杠的字符串。
不过,通过使用 QRegExp 和 Wildcard 语法来使用我们自己的循环实现搜索可以按预期工作。
https://doc.qt.io/qt-5.15/sourcebreaks.html 没有提供任何可能发生变化的指针。