找回密码
 立即注册
收起左侧

Qt开发经验小技巧276-280

0
回复
1423
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2023-6-30 11:42:31 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
276. 对MDI窗体区域设置背景颜色透明,会发现 QMdiArea{background:transparent;} 无效,哪怕是指定颜色 QMdiArea{background:#ff0000;} 或者 QMdiArea{background-color:#ff0000;} 都不行,这就很无语了,原来要用弱属性机制才行。QMdiArea{qproperty-background:transparent;}

277. 当样式中启用了禁用样式 *:disabled{xxx} 的时候,会发现MDI子窗体无法拉伸了,这应该是Qt内部的BUG,怎么解决呢,只需要重新设置MDI这个类别的禁用样式的边框样式即可。QMdiSubWindow:disabled{border:8px solid rgba(0,0,0,0);}

278. 用QProcess执行命令或者启动可执行文件,默认写法不支持带空格的路径,比如 Program Files ,需要在这个路径前后加上双引号才行,估计可能内部会用空格分割字符串导致解析失败。普通路径加上引号也能正常执行,所以为了确保以防万一,统一加上引号即可。
```cpp
QString cmd = "c:/Program Files/a.exe";
//下面这个会执行失败
QProcess::startDetached(cmd);

//前后加上引号就可以正常执行
cmd = "\"" + cmd + "\"";
QProcess::startDetached(cmd);
```

279. 在循环中取值,临时变量的定义尽量在循环外层定义,每次在循环里层定义会增加开销,特别是复杂类型比如QString(基础类型比如int/bool差别不大),循环次数越多,性能差别越大。
```cpp
void MainWindow:n_pushButton_clicked()
{
    QElapsedTimer timer;
    timer.start();

    QString s;
    QString text = "abc";
    for (int i = 0; i < 10000; ++i) {
        s = text.at(0);
    }

    qDebug() << "方式1" << timer.nsecsElapsed();
}


void MainWindow:n_pushButton_2_clicked()
{
    QElapsedTimer timer;
    timer.start();

    QString text = "abc";
    for (int i = 0; i < 10000; ++i) {
        QString s = text.at(0);
    }

    qDebug() << "方式2" << timer.nsecsElapsed();
}

//debug模式下方式1比方式2快6倍+
//release模式下方式1比方式2快30倍+
```

280. Qt的属性机制非常强大,除了可以用来控制样式表,也可以很方便的用来传值,比如qml中的值传递,有时候我们写了一个通用类,希望这个类可以做很多事情,但是又希望其中有一些特殊变量存取值,一种办法是直接定义私有变量,提供get/set接口函数,还有一种偷懒的办法就是用属性setProperty/property,然Qt内部从元对象数据层面自己管理,这样不用在类中写对应的变量和get/set函数。但是肯定有性能损耗,性能上肯定比变量低,所以要看具体的实际需求,如果不是非常频繁的调用setProperty/property,通用性优先的话,那用属性机制会更方便。个人推荐方式三,继承通用类,在子类中增加set/get。
```cpp
void MainWindow:n_pushButton_clicked()
{
    QElapsedTimer timer;
    timer.start();

    for (int i = 0; i < 10000; ++i) {
        Test *t = new Test;
        //t->setId(i);
        //t->setName("test");
        t->getName();
    }

    qDebug() << "方式1" << timer.nsecsElapsed();
}

void MainWindow:n_pushButton_2_clicked()
{
    QElapsedTimer timer;
    timer.start();

    for (int i = 0; i < 10000; ++i) {
        Test *t = new Test;
        //t->setProperty("id", i);
        //t->setProperty("name", "test");
        t->property("name").toString();
    }

    qDebug() << "方式2" << timer.nsecsElapsed();
}

//对比测试和具体的变量类型无关/int和QString类型产生的性能差别一样
//setProperty比setxxx方式性能差3倍+
//property比getxxx方式性能差1.3倍
```
国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)

参与人数 1人气 +2 收起 理由
Yujing_7 + 2

查看全部评分总评分 : 人气 +2

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了