一、Qt Widgets 问题交流
1.给 QTabBar::tab 设置样式表字体后文字左右被剪切
在样式表设置 QTabBar::tab 的字体后文字就不能完整显示了,在 Qt Bug Tracker 可以看到 Qt4 就存在的问题,https://bugreports.qt.io/browse/QTBUG-8209
解决的方法是,不直接给 tab 设置字体,而是给上级如 QTabBar 设置字体。
(不过实际效果有时还是会少 1 像素左右,勉强能看)
2.QTreeWidget横项滚动条适应内容宽度
加两句设置:
//ui->treeWidget->expandAll();
ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->treeWidget->header()->setStretchLastSection(false);
注意: ResizeToContents 是设置给 Header 的,不是 ui 里那个给 ScrollArea 设置的。
不过在树层级比较深的时候有点卡。
3.关闭模态窗口,有时候主窗口会跑到其他窗口后面去
文中提到,该问题是windows的BUG,问题原因是,在模态窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。所以在模态窗口关闭的时候,就忽略了主窗口可以激活,于是找到主窗口下方的一个可以被激活的窗口,这时激活他,于是这个被找到的窗口就在主窗口的上面。
解决方式,在模态窗口关闭时激活主窗口即可:
void activeWindow()
{
this->show();
this->raise();
this->activateWindow();
}
或者关闭时设置为非模态(待测试)。
4.QTableView表头设置了visible为true却还是不显示
今天把把Table的表头行设置为可见,但是运行起来却看不到。
tableView->verticalHeader()->setVisible(true);
调了半天才发现我样式表里只给QHeaderView::section设置了高度,却没设置宽度,结果他就默认宽度为0了。
QHeaderView::section{
height:25px;
width:60px; /*之前没设置*/
}
二、Qt Quick 问题交流
1.Loader卸载Scene3D时崩溃(待解决)
当我试图用 Loader 动态切换我的 Qt3D 示例时,发现卸载带 Scene3D 的组件会崩溃:
参见 Qt bug tracker:https://bugreports.qt.io/browse/QTBUG-64974
本来想用 Scene3DView 来切换,发现不能正常显示。
而且使用 MSVC2019 + Qt5.15 ,关闭 Qt3D 的程序时也会异常结束。
三、其他
1.去掉字符串空白符
QString 方式:
#include <QRegularExpression>
#include <QDebug>
void test()
{
QString str=" Date:2017-10-10\v \t 全角 空格\n \r\n~ 2017-10-15 ";
//去掉头尾空白符,并把单词中间的空白符替换为单个空格(全角空格也替换了)
//可以配合replace把全部空格去掉
qDebug()<<str.simplified();
//去掉头尾空白符
qDebug()<<str.trimmed();
//去掉空白符和全角空格
qDebug()<<str.replace(QRegularExpression("\\s|\u3000"),"");
}
std::string 方式:
#include <iostream>
#include <string>
#include <regex>
void test()
{
std::string text = " Date:2017-10-10\v \t \n \r\n~ 2017-10-15 ";
//\s匹配任意空百符
std::string pattern = "\\s";
std::regex express(pattern);
//使用正则将空百符替换掉
std::string result = std::regex_replace(text, express, "");
std::cout << result << std::endl;
}