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

Qt开发经验小技巧256-260

0
回复
1347
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2022-12-14 11:09:59 显示全部楼层 |阅读模式

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

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

x
256. 默认QDialog窗体右下角有个拉伸尺寸的手柄,通过它可以对窗体拉伸大小,这个控件很容易被遗忘但是又经常可以看到,他的名字叫QSizeGrip,可以通过setSizeGripEnabled来启用或者禁用,也可以用qss对外观进行设置。
```cpp
QSizeGrip {
        image:url(:/image/sizegrip.png);
        width:10px;
        height:10px;
}
```


257. 在有些没有opengl环境的Qt开发中,比如一些嵌入式板子为了节省资源没有编译opengl所以不会有opengl相关的头文件,在编译项目过程中可能遇到提示 GLES3/gl3.h: No such file or directory,尽管你的项目中也没有用到opengl的任何东西,那是因为你包含了一个大模块 #include <QtWidgets> ,而这个大模块中包含了 #include "qopenglwidget.h" ,你需要做的是在引入大模块前面加一行。
```cpp
//下面两个定义看具体需求调整
#define QT_NO_OPENGL
#define QT_NO_OPENGL_ES_3
#include <QtWidgets>
```


258. 可以通过设置过滤机制,将代码中的部分打印类别屏蔽掉,比如只保留qdebug打印的信息,也可以将Qt内部类的警告信息屏蔽,只保留自己程序写的打印信息。
```cpp
//代码写在main函数最前面
int main(int argc, char *argv[])
{
        QLoggingCategory::setFilterRules("*.critical=false");
        QApplication a(argc, argv);
}


//下面表示将所有的debug打印信息屏蔽
QLoggingCategory::setFilterRules("*.debug=false");
//下面最终打印 222
qDebug() << "111";
qInfo() << "222";


//下面表示将所有的打印信息屏蔽
QLoggingCategory::setFilterRules("*=false");


//下面可以将所有警告提示屏蔽(Qt内部类中出现的警告信息都用的这个qErrnoWarning对应的就是critical)
QLoggingCategory::setFilterRules("*.critical=false");


//支持多个规则写法(有部分警告信息用的qWarning所以也要加进去)
QLoggingCategory::setFilterRules("*.critical=false\n*.warning=false");
```


259. 官方的Qt安装包基本上都带了各种高级模块比如浏览器模块webengine以及多媒体模块q,有些嵌入式的环境或者厂家提供好的Qt环境,未必有这些模块,需要单独打命令安装。
```cpp
//如果找不到音频输入输出设备需要执行下面这个命令
sudo apt-get install libqt5multimedia5-plugins
//也可以一次性安装所有
sudo apt-get install libqt5*
```


260. 项目大了以后,经常需要将某些类做成单例类,在整个项目中唯一存在,供多个地方使用,如果一个就一个类需要写成单例模式,那直接写在那个类中即可,如果类多了的话,会发现都是一些重复的定义代码,此时可以考虑用个宏定义,传入类名即可,代码量虽然少了可能绩效低了,但是水平提升了。
```cpp
#ifndef QUISINGLETON_H
#define QUISINGLETON_H


#include <QScopedPointer>
#include <QMutex>


#define SINGLETON_DECL(Class) \
    public: \
        static Class *Instance(); \
    private: \
        Q_DISABLE_COPY(Class) \
        static QScopedPointer<Class> self;


#define SINGLETON_IMPL(Class) \
    QScopedPointer<Class> Class::self; \
    Class *Class::Instance() { \
        if (self.isNull()) { \
            static QMutex mutex; \
            QMutexLocker locker(&mutex); \
            if (self.isNull()) { \
                self.reset(new Class); \
            } \
        } \
        return self.data(); \
    }


#endif // QUISINGLETON_H


//使用的时候在头文件和实现文件各加一行代码即可
#include "quisingleton.h"
class Form : public QWidget
{
    Q_OBJECT SINGLETON_DECL(Form)
}


SINGLETON_IMPL(Form)
Form::Form(QWidget *parent) : QWidget(parent), ui(new Ui::Form)
{
    ui->setupUi(this);
}
```
国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)

回复

使用道具 举报

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

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