1. 使用QTreeView还是QTreeWidget,参考QTreeView or QTreeWidget
简单说,就是前者基于可定制的Modal/View模型,后者虽然也是如此,但是内置了这个功能,定制性不强。
Mac下开发GUI,目前有两种方案,一个是QML Graphical User Interfaces,一个是Widget-based User Interfaces。
简单来说Qt Quick是使用QML/JS混编、可以快速开发的面向App开发的解决方案。但是对于桌面的操作习惯支持还有很大的不足,比如菜单,工具栏,对话框,以及桌面端工业标准的控件。Qt Widget/View作为传统的Qt开发解决方案,可以完美解决上述不足。
所以这就有了结合二者优点的方案,Combining Qt Widgets and QML with QWidget::createWindowContainer()
3. 推荐使用Qt5的新的connect函数,使用函数指针作为参数。
4. 使用创建自ui文件的view,具体方案可以参考:Using a Designer UI File in Your Application,
简单说就是两大种方式:
编译时 有三种方式使用ui类,1. 直接创建并使用ui类,不过要手动添加一个ui类头文件; 2. 创建一个继承自QWidget或者QDialog的类,当然自己要创建一个ui界面资源类了;3. 创建一个UI类,该类继承QWidget或者QDialog,同时继承了Ui命名空间下的该类。DevToolsSecurity -enable
运行时 可以使用QtTools模块,这个类似DuiLib中的操作,这种方式可以将ui文件放在资源文件中当作一个资源加载类对待,可参考Text Finder Example示例。可以使用QObject::findChild方法加载。这种方法应该是适合要动态加载某一类模板的方案
动态connect信号和槽,又分为两种方式:硬编码在类的构造函数中,就是写出connect函数;或者使用QMetaObject方法按照固定的格式写好函数(void on_<object name>_<signal name>(<signal parameters>);)
5. 如何在QTreeView中使用自定义的元素。参考CUSTOM QTREEVIEW WITH MULTIPLE CUSTOM WIDGETS AS RENDERING DELEGATES
6. 如何定义Qt Creator中的license模板,参考Qt官网的Tips and Tricks。
7. qt中使用Qt的智能指针,还是std的? 参考:What C++ Smart Pointer Implementations are available?
简单来说就是Qt中的智能指针可以保证各平台一致的实现,并且是线程安全的。推荐在Qt项目中使用Qt的智能指针。
关于std::shared_ptr的线程安全参考:std::shared_ptr thread safety
8. Qt Creator在使用调试器的时候,有时候对变量的值显示为not accessble。其实并不是真的显示不了,而是显示的格式需要你选择一下。可以右键设置Display format。
9, out-of-line虚函数的警告:参考clang: no out-of-line virtual method definitions (pure abstract C++ class)。
10, 自定义Qt Creator的主题风格:方法参考这个git:Qt-Creator-Darcula 。以及这篇博客。比如说我的styles文件夹位于:D:\Qt\Qt5.10.1\Tools\QtCreator\share\qtcreator\styles。如果设置了Qt的快捷方式菜单启动命令,以及注册表中打开pro文件的默认参数,即可使用指定的theme。
11, QString的字符串排序大有讲究啊:Qt之QString中文支持,按照这里的说法,我尝试在排序的时候将QString转为16/32位的字符单位的字符串就可以得到正确的排序了。QString在一般的Qt项目中应该是使用了utf8的编码方式。不适合数字+字母+汉字的排序。
int ContactGroup::compareCommonTreeviewItem(CommonTreeViewItem *item1, CommonTreeViewItem *item2)
{
auto left = dynamic_cast<GroupTreeItemPtr>(item1);
auto right = dynamic_cast<GroupTreeItemPtr>(item2);
CHECK_RETURN_VALUE(left && right, 0);
auto left_name = left->name().toStdU16String();
auto right_name = right->name().toStdU16String();
auto ret = left_name < right_name;
return ret ? -1 : 0;
}
Qt中提供的相关的类有:QCollator,QLocale,MeeGo Touch Framework中的MCollator实现了中文排序。
12, qt设置调试器:Setting Up Debugger
13, Qt中字体大小的跨平台设置:相同point size的字体在mac上要小一些。这个怎么解决???
14, Qt中的jom工具是干什么用的?
15, unscoped enumerator和scoped enumerator有什么区别?前者可知隐式转换为int,后者不会??
16, C++中new一个对象出来之后,是否需要判断空呢?参考Should one always check, if the new operator worked?,How to check if memory allocation failed?,以及我的一篇老文章C++中new与delete的定制 ,简单地说
T* pointer = new T();
if (pointer == nullptr) {
// will not come here
}
这样的判断在现在的C++中其实根本不会执行到判空逻辑内部。
17, Qt设置mac中Dock的icon。参考这里。
18, Qt中QLabel自动换行需要设置wordwrapper属性为true。
19, Qt使用VS打开 Visual Studio 2015 Git无法使用SSH协议的解决方法,
20, 在QWidget中判断某个鼠标点击是否在widget内部,可以将widget的rect转化到全局坐标系(调用widget的mapToGlobal方法)之后,全部的判断都在全局坐标系中完成。
21,Qt调试进Qt库,需要下载Qt编译好的pdb包,并设置路径:
比如在Debugger->CDB paths中设置:
F:\qt debug\qtcreator-debug\bin
F:\qt debug\qtcreator-debug\lib\qtcreator\plugins
22, Qt编译加速
参考:Improving build times of large Qt apps How to Make Your C++ Qt Project Build 10x Faster with 4 Optimizations
23, Qt得到给定文件的默认Icon:
QString path;
QUrl url(text);
QFileInfo info(url.authority(QUrl::PrettyDecoded));
if (!info.exists()) {
return label;
}
QFileIconProvider ip;
QIcon icon = ip.icon(info);
label->setPixmap(icon.pixmap(64, 64, QIcon::Mode::Normal, QIcon::State::On));
24,qt屏蔽系统睡眠参考这里Is there a way in Qt to prohibit the computer from going to sleep?
25, 安装好Qt Creator之后启动调试,每次都提醒:"Developer tools access" 需控制另一个进程才能继续调试,解决办法是执行:
sudo /usr/sbin/DevToolsSecurity --enable
之后提示:Developer mode is now enabled. 说明成功。
26, 系统升级到10.14.4之后,App Store版本的cc运行会发生闪屏的现象,同时调试的时候报错说:
CCtalk[2383:20588] [com.hujiang.mac.cctalk] CGContextRestoreGState: invalid context 0x0.
CCtalk[2383:20588] [com.hujiang.mac.cctalk] CGContextSaveGState: invalid context 0x0.
CCtalk[2383:20588] [com.hujiang.mac.cctalk] CGContextTranslateCTM: invalid context 0x0.
CCtalk[2383:20588] [com.hujiang.mac.cctalk] CGContextScaleCTM: invalid context 0x0.
CCtalk[2383:20588] [com.hujiang.mac.cctalk] CGContextDrawImage: invalid context 0x0.
同时提示,如果想要查看调用堆栈,设置环境变量CG_CONTEXT_SHOW_BACKTRACE,找了半天才发现设置的方法:
在~/Library/LaunchAgents/下创建一个plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl setenv CG_CONTEXT_SHOW_BACKTRACE TRUE</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
其中标红的是关键代码。
激活这个环境变量执行命令:
launchctl load ~/Library/LaunchAgents/environment.plist launchctl start ~/Library/LaunchAgents/environment.plist
当然也可以更新并重新激活这个命令:
launchctl stop ~/Library/LaunchAgents/environment.plist launchctl unload ~/Library/LaunchAgents/environment.plist launchctl load ~/Library/LaunchAgents/environment.plist launchctl start ~/Library/LaunchAgents/environment.plist
注意:这个方法在10.14.4上有效。其他系统不保证有效。
之后,最好重启一下系统,然后重新启动Qt Creator,就可以在Application Output中看到出现上述错误的时候对应的堆栈。可以进一步对调试有帮助。
参考:Setting global environment variables on OS X
27,