美文网首页Qt学习
Qt开发经验总结之武林秘籍

Qt开发经验总结之武林秘籍

作者: feiyangqingyun | 来源:发表于2019-06-02 12:01 被阅读13次

    一、开发经验总结

    1. 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。

    2. 定时器是个好东西,学会好使用它,有时候用QTimer::singleShot可以解决意想不到的问题。

    3. 打开creator,在构建套件的环境中增加MAKEFLAGS=-j8,可以不用每次设置多线程编译。珍爱时间和生命。新版的QtCreator已经默认就是j8。

    4. 如果你想顺利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。

    5. 很多时候找到Qt对应封装的方法后,记得多看看该函数的重载,多个参数的,你会发现不一样的世界,有时候会恍然大悟,原来Qt已经帮我们封装好了。

    6. 可以在pro文件中写上标记版本号+ico图标(Qt5才支持)

    VERSION     = 2018.7.25
    RC_ICONS    = main0.ico
    
    1. 管理员运行程序,限定在MSVC编译器。
    QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" #以管理员运行
    QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,\"5.01\" #VS2013 在XP运行
    
    1. 运行文件附带调试输出窗口
      CONFIG += console pro

    2. 绘制平铺背景QPainter::drawTiledPixmap
      绘制圆角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();

    3. 移除旧的样式

    //移除原有样式
    style()->unpolish(ui->btn);
    //重新设置新的该控件的样式。
    style()->polish(ui->btn);
    
    1. 获取类的属性
    const QMetaObject *metaobject = object->metaObject();
    int count = metaobject->propertyCount();
    for (int i = 0; i < count; ++i) {
        QMetaProperty metaproperty = metaobject->property(i);
        const char *name = metaproperty.name();
        QVariant value = object->property(name);
        qDebug() << name << value;
    }
    
    1. Qt内置图标封装在QStyle中,大概七十多个图标,可以直接拿来用。
      QStyle::SP_TitleBarMenuButton

    2. 根据操作系统位数判断加载

    win32 {
        contains(DEFINES, WIN64) { DESTDIR = $${PWD}/../../bin64
        } else { DESTDIR = $${PWD}/../../bin32 }
    }
    
    1. Qt5增强了很多安全性验证,如果出现setGeometry: Unable to set geometry,请将该控件的可见移到加入布局之后。

    2. 可以将控件A添加到布局,然后控件B设置该布局,这种灵活性大大提高了控件的组合度,比如可以在文本框左侧右侧增加一个搜索按钮,按钮设置图标即可。

    QPushButton *btn = new QPushButton;
    btn->resize(30, ui->lineEdit->height());
    QHBoxLayout *layout = new QHBoxLayout(ui->lineEdit);
    layout->setMargin(0);
    layout->addStretch();
    layout->addWidget(btn);
    
    1. 对QLCDNumber控件设置样式,需要将QLCDNumber的segmentstyle设置为flat。

    2. 巧妙的使用findChildren可以查找该控件下的所有子控件。findChild为查找单个。

    //查找指定类名objectName的控件
    QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
    //查找所有QPushButton
    QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
    //查找一级子控件,不然会一直遍历所有子控件
    QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly);
    
    1. 巧妙的使用inherits判断是否属于某种类。
    QTimer *timer = new QTimer;         // QTimer inherits QObject
    timer->inherits("QTimer");          // returns true
    timer->inherits("QObject");         // returns true
    timer->inherits("QAbstractButton"); // returns false
    
    1. 使用弱属性机制,可以存储临时的值用于传递判断。

    2. 在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是。

    3. 如果出现Z-order assignment: " is not a valid widget.错误提示,用记事本打开对应的ui文件,找到<zorder></zorder>为空的地方,删除即可。

    4. 善于利用QComboBox的addItem的第二个参数设置用户数据,可以实现很多效果,使用itemData取出来。

    5. 如果用了webengine模块,发布程序的时候带上QtWebEngineProcess.exe+translations文件夹+resources文件夹。

    6. a.setAttribute(Qt::AA_NativeWindows);可以让每个控件都拥有独立的句柄。

    7. Qt+Android防止程序被关闭。

    #if defined(Q_OS_ANDROID)
    QAndroidService a(argc, argv);
    return a.exec()
    #else
    QApplication a(argc, argv);
    return a.exec();
    #endif
    
    1. 可以对整体的指示器设置样式,例如 ::down-arrow,::menu-indicator{} ::up-arrow:disabled,::up-arrow:off{}。

    2. 可以执行位置设置背景图片。

    QMainWindow > .QWidget {
        background-color: gainsboro;
        background-image: url(:/images/pagefold.png);
        background-position: top right;
        background-repeat: no-repeat
    }
    
    1. 嵌入式linux运行Qt程序 Qt4写法:./HelloQt -qws & Qt5写法:./HelloQt --platform xcb

    2. Qtcreator软件的配置文件存放在:C:\Users\Administrator\AppData\Roaming\QtProject,有时候如果发现出问题了,将这个文件夹删除后打开creator自动重新生成即可。

    3. QMediaPlayer依赖本地解码器,WIN上下载k-lite或者LAV Filters安装即可。

    4. 代码判断MSVC编译器版本,if (_MSC_VER == 1800),对应关系2013=1800 2012=1700 2010=1600 2008=1500 2005=1400

    5. 在pro中判断不同平台:message($$QT_ARCH) contains(QT_ARCH,arm)。

    6. Qt最小化后恢复界面假死冻结,加上代码

    void showEvent(QShowEvent *e){
    setAttribute(Qt::WA_Mapped);
    QWidget::showEvent(e);
    }
    
    1. 获取标题栏高度:style()->pixelMetric(QStyle::PM_TitleBarHeight); PM_TitleBarHeight点进去你会发现新大陆。

    2. 设置高分屏属性以便支持2K4K等高分辨率,尤其是手机app。必须写在main函数的QApplication a(argc, argv);的前面。

    #if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
        QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif
    
    1. 如果运行程序出现 Fault tolerant heap shim applied to current process. This is usually due to previous crashes. 错误。
      办法:打开注册表,找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\,选中Layers键值,从右侧列表中删除自己的那个程序路径即可。

    2. Qt内置了QFormLayout表单布局用于自动生成标签+输入框的组合的表单界面。

    3. qml播放视频在linux需要安装 sudo apt-get install libpulse-dev。

    4. 可以直接继承QSqlQueryModel实现自定义的QueryModel,比如某一列字体颜色,占位符,其他样式等,重写QVariant CustomSqlModel::data(const QModelIndex &index, int role) const。

    5. Qt5以后提供了类QScroller直接将控件滚动。

    ui->listWidget->setHorizontalScrollMode(QListWidget::ScrollPerPixel);
    QScroller::grabGesture(ui->listWidget,QScroller::LeftMouseButtonGesture);
    
    1. 如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库。
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    
    1. 清空数据表并重置自增ID,sql = truncate table table_name。

    2. Qtchart模块最低要求Qt5.4。

    3. QPushButton左对齐文字,需要设置样式表QPushButton{text-align:left;}

    4. 不要怀疑这部分被狗吃了,_中间部分待更新,会持续更新。也欢迎各位在文章底部留言加进去。

    1. Qt界的中文乱码问题,版本众多导致的如何选择安装包问题,如何打包发布程序的问题,堪称Qt界的三座大山!

    2. Qt安装目录下的Examples目录下的例子,看完学完,月薪20K起步。

    3. 崩溃的80%都是因为要么越界,要么未初始化,死扣这两点,80%的问题解决了。

    4. 我一般保留四个版本,为了兼容qt4用4.8.7,最后的支持XP的版本5.7.0,最新的长期支持版本5.9.8,最高的新版本比如5.12.3。

    5. 终极秘籍:如果遇到问题搜索Qt方面找不到答案,试着将关键字用JAVA C# android打头,你会发现别有一番天地,其他人很可能做过!

    6. 最后一条:珍爱生命,远离编程。祝大家头发浓密,睡眠良好,情绪稳定,财富自由!

    二、推荐的Qt论坛+个人博客+网站

    名称 网址
    qtcn http://www.qtcn.org
    豆子的空间 https://www.devbean.net
    yafeilinux http://www.qter.org
    一去二三里 http://blog.csdn.net/liang19890820
    乌托邦2号 http://blog.csdn.net/taiyang1987912
    foruok http://blog.csdn.net/foruok
    jason http://blog.csdn.net/wsj18808050
    朝十晚八 http://www.cnblogs.com/swarmbees
    BIG_C_GOD http://blog.csdn.net/big_c_god
    公孙二狗 https://qtdebug.com/qtbook
    雨田哥 https://blog.csdn.net/ly305750665
    郑天佐 https://blog.csdn.net/zhengtianzuo06
    寒山-居士 https://blog.csdn.net/esonpo
    feiyangqingyun https://blog.csdn.net/feiyangqingyun
    前行中小猪 http://blog.csdn.net/goforwardtostep
    涛哥的知乎专栏 https://zhuanlan.zhihu.com/TaoQt
    Qt老外视频教程 http://space.bilibili.com/2592237/#!/index
    Qt维基补充文档 https://wiki.qt.io/Main
    Qt源码查看网站 https://code.woboq.org/qt5

    三、微信公众号

    欢迎关注微信公众号【高效程序员】,C++/Python、学习方法、写作技巧、热门技术、职场发展等内容,干货多多,福利多多!

    相关文章

      网友评论

        本文标题:Qt开发经验总结之武林秘籍

        本文链接:https://www.haomeiwen.com/subject/qwcxxctx.html