一、Qt Widgets 问题交流

1.给 QTabBar::tab 设置样式表字体后文字左右被剪切

在样式表设置 QTabBar::tab 的字体后文字就不能完整显示了,在 Qt Bug Tracker 可以看到 Qt4 就存在的问题,https://bugreports.qt.io/browse/QTBUG-8209

QListWidgetItem 字体颜色_模态窗口

解决的方法是,不直接给 tab 设置字体,而是给上级如 QTabBar 设置字体。

QListWidgetItem 字体颜色_#include_02

(不过实际效果有时还是会少 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 的组件会崩溃:

QListWidgetItem 字体颜色_空白符_03

参见 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;
}