Qt開發經驗小技巧256-260

  1. 默認QDialog窗體右下角有個拉伸尺寸的手柄,通過它可以對窗體拉伸大小,這個控件很容易被遺忘但是又經常可以看到,他的名字叫QSizeGrip,可以通過setSizeGripEnabled來啓用或者禁用,也可以用qss對外觀進行設置。
QSizeGrip {
	image:url(:/image/sizegrip.png);
	width:10px;
	height:10px;
}
  1. 在有些沒有opengl環境的Qt開發中,比如一些嵌入式板子爲了節省資源沒有編譯opengl所以不會有opengl相關的頭文件,在編譯項目過程中可能遇到提示 GLES3/gl3.h: No such file or directory,儘管你的項目中也沒有用到opengl的任何東西,那是因爲你包含了一個大模塊 #include ,而這個大模塊中包含了 #include "qopenglwidget.h" ,你需要做的是在引入大模塊前面加一行。
//下面兩個定義看具體需求調整
#define QT_NO_OPENGL
#define QT_NO_OPENGL_ES_3
#include <QtWidgets>
  1. 可以通過設置過濾機制,將代碼中的部分打印類別屏蔽掉,比如只保留qdebug打印的信息,也可以將Qt內部類的警告信息屏蔽,只保留自己程序寫的打印信息。
//代碼寫在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");
  1. 官方的Qt安裝包基本上都帶了各種高級模塊比如瀏覽器模塊webengine以及多媒體模塊q,有些嵌入式的環境或者廠家提供好的Qt環境,未必有這些模塊,需要單獨打命令安裝。
//如果找不到音頻輸入輸出設備需要執行下面這個命令
sudo apt-get install libqt5multimedia5-plugins
//也可以一次性安裝所有
sudo apt-get install libqt5*
  1. 項目大了以後,經常需要將某些類做成單例類,在整個項目中唯一存在,供多個地方使用,如果一個就一個類需要寫成單例模式,那直接寫在那個類中即可,如果類多了的話,會發現都是一些重複的定義代碼,此時可以考慮用個宏定義,傳入類名即可,代碼量雖然少了可能績效低了,但是水平提升了。
#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://github.com/feiyangqingyun

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章