打印

一份硬核的QT开发经验及资料分享,长文收藏!

[复制链接]
2649|94
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
micoccd|  楼主 | 2022-6-13 13:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、QT学习资料

1、相关书籍

(1)C++入门书籍推荐《C++ primer plus》,进阶书籍推荐《C++ primer》。

(2)Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》,qml书籍推荐《Qt5编程入门》。

(3)强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!


使用特权

评论回复
沙发
micoccd|  楼主 | 2022-6-13 13:05 | 只看该作者
2、Qt论坛+个人博客+网站+群
名称网址
QQ学习群Qt交流大会群 853086607 Qt技术交流群 46679801 Qt进阶之路群 734623697
QtWidget开源demo集合?https://gitee.com/feiyangqingyun/QWidgetDemo
QtQuick/Qml开源demo集合?https://gitee.com/jaredtao/TaoQuick
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君?https://blog.csdn.net/nicai_xiaoqinxi
Qt老外视频教程?http://space.bilibili.com/2592237/#!/index
Qt维基补充文档?https://wiki.qt.io/Main
Qt源码查看网站?https://code.woboq.org/qt5
Qt官方下载地址?https://download.qt.io
Qt官方下载新地址?https://download.qt.io/new_archive/qt/
Qt国内镜像下载地址?https://mirrors.cloud.tencent.com/qt
Qt安装包下载地址?http://qthub.com/download/ (超过1000多个,由Qt君整理)
精美图表控件QWT?http://qwt.sourceforge.net/
精美图表控件QCustomPlot?https://www.qcustomplot.com/
免费图标下载?http://www.easyicon.net/
图形字体下载?https://www.iconfont.cn/
漂亮界面网站?https://www.ui.cn/

使用特权

评论回复
板凳
micoccd|  楼主 | 2022-6-13 13:07 | 只看该作者
二、QT开发经验总结
  • 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。

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

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

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

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


使用特权

评论回复
地板
micoccd|  楼主 | 2022-6-13 13:08 | 只看该作者
Qt内置图标封装在QStyle中,大概七十多个图标,可以直接拿来用。
VERSION  = 2020.10.25
RC_ICONS = main0.ico


使用特权

评论回复
5
micoccd|  楼主 | 2022-6-13 13:08 | 只看该作者
管理员运行程序,限定在MSVC编译器。
QMAKE_LFLAGS += /MANIFESTUAC:"level='requireAdministrator' uiAccess='false'" #以管理员运行
QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,"5.01" #VS2013 在XP运行


使用特权

评论回复
6
micoccd|  楼主 | 2022-6-13 13:10 | 只看该作者
  • 运行文件附带调试输出窗口 CONFIG += console pro

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



使用特权

评论回复
7
micoccd|  楼主 | 2022-6-13 13:11 | 只看该作者
移除旧的样式
//移除原有样式
style()->unpolish(ui->btn);
//重新设置新的该控件的样式。
style()->polish(ui->btn);


使用特权

评论回复
8
micoccd|  楼主 | 2022-6-13 13:11 | 只看该作者
获取类的属性
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;
}


使用特权

评论回复
9
micoccd|  楼主 | 2022-6-13 13:13 | 只看该作者
  • Qt内置图标封装在QStyle中,大概七十多个图标,可以直接拿来用。
    SP_TitleBarMenuButton,
    SP_TitleBarMinButton,
    SP_TitleBarMaxButton,
    SP_TitleBarCloseButton,
    SP_MessageBoxInformation,
    SP_MessageBoxWarning,
    SP_MessageBoxCritical,
    SP_MessageBoxQuestion,
    ...


使用特权

评论回复
10
micoccd|  楼主 | 2022-6-13 13:14 | 只看该作者
  • 根据操作系统位数判断加载
    win32 {
        contains(DEFINES, WIN64) { DESTDIR = ${PWD}/../../bin64
        } else { DESTDIR = ${PWD}/../../bin32 }
    }


使用特权

评论回复
11
micoccd|  楼主 | 2022-6-13 13:15 | 只看该作者
Qt5增强了很多安全性验证,如果出现setGeometry: Unable to set geometry,请将该控件的可见移到加入布局之后。

使用特权

评论回复
12
micoccd|  楼主 | 2022-6-13 13:15 | 只看该作者
  • 可以将控件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);



使用特权

评论回复
13
micoccd|  楼主 | 2022-6-13 13:17 | 只看该作者
对QLCDNumber控件设置样式,需要将QLCDNumber的segmentstyle设置为flat。

使用特权

评论回复
14
micoccd|  楼主 | 2022-6-13 13:18 | 只看该作者
巧妙的使用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);


使用特权

评论回复
15
micoccd|  楼主 | 2022-6-13 13:20 | 只看该作者
巧妙的使用inherits判断是否属于某种类。
QTimer *timer = new QTimer;         // QTimer inherits QObject
timer->inherits("QTimer");          // returns true
timer->inherits("QObject");         // returns true
timer->inherits("QAbstractButton"); // returns false


使用特权

评论回复
16
micoccd|  楼主 | 2022-6-13 13:22 | 只看该作者
使用弱属性机制,可以存储临时的值用于传递判断。可以通过widget->dynamicPropertyNames()列出所有弱属性名称,然后通过widget->property("name")取出对应的弱属性的值。

使用特权

评论回复
17
micoccd|  楼主 | 2022-6-13 13:22 | 只看该作者
在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是。如果是初学阶段或者测试阶段可以直接UI上右键设置样式表,正式项目还是建议统一到一个qss样式表文件比较好,统一管理。

使用特权

评论回复
18
micoccd|  楼主 | 2022-6-13 13:24 | 只看该作者
  • 如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可。

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

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

  • 默认Qt是一个窗体一个句柄,如果要让每个控件都拥有独立的句柄,设置下 a.setAttribute(Qt::AA_NativeWindows);



使用特权

评论回复
19
micoccd|  楼主 | 2022-6-13 13:25 | 只看该作者
Qt+Android防止程序被关闭。
#if defined(Q_OS_ANDROID)
QAndroidService a(argc, argv);
return a.exec()
#else
QApplication a(argc, argv);
return a.exec();
#endif


使用特权

评论回复
20
micoccd|  楼主 | 2022-6-13 13:27 | 只看该作者
可以对整体的指示器设置样式,例如 ::down-arrow,::menu-indicator{}  ::up-arrow:disabled,::up-arrow:off{}。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

722

帖子

1

粉丝