一、Qt Widgets 问题交流
1.QObject多继承报错
父类列表中只能有一个QObject或其派生类:
并且QObject需要写在父类列表的第一个:
所以,正确写法如下:
2.给控件注册了过滤器,但有些事件没有被过滤器截获
有些控件具有子控件或者view,事件被其截获,我们需要把过滤器设置到子部件才能截获到这些事件。
以双击事件为例,有如下过滤器:
在QComboBox可编辑状态下,可以这样写:
通过debug打印的内容可以看到点击编辑区域实际上是被QLineEdit子部件截获了。
在QListView中通过viewport()来获取内部QWidget*指针:
3.给对象安装过滤器后,显示或者操作异常
看看是否是eventFilter函数处理相关事件后返回了true(返回true就不会再继续传递了)。
以ListWidget为例,过滤器中双击返回true后ListWidget的双击事件信号就不能触发了:
可以看到并没有打印“double click”,这种情况我们可以不返回rue:
这时点击item就能正常触发双击信号了。
4.QTreeView/QTreeWidget展开/收起节点
展开调用expand相关的函数,收起调用collapse相关的函数。
5.系统默认是英文,导致日历也是英文
Qt中有QLocale对象,封装了Locale的属性和方法,用来在不同语言下,实现各种数字与表达它们的字符串之间的转换。
ui->calendarWidget->setLocale(QLocale(QLocale::C,QLocale::UnitedStates));
通过上面的代码,我就把日历的Locale设置为了英国,于是就显示英文(下图左):
QLocale也可以用在格式化输出中:
QLocale currentlocale = QLocale::system();
qDebug()<<"default "<<currentlocale;
//zh_CN
//QLocale::setDefault(QLocale("zh_CN"));
QLocale::setDefault(QLocale(QLocale::Chinese,QLocale::China));
qDebug()<<"zh_CN "<<QLocale();
qDebug() << QLocale().toString(QDate::currentDate());
参考:https://blog.csdn.net/wmx843230304wmx/article/details/91671240
参考:https://blog.csdn.net/easebone/article/details/7580639
6.设置背景色过渡动画
可以通过属性动画来修改背景:
#include <QPropertyAnimation>
...
QPropertyAnimation *animation=new QPropertyAnimation(this,"background");
animation->setDuration(5000);
animation->setStartValue(QColor(240,240,240));
animation->setEndValue(QColor(200,200,200));
animation->start();
...
上面代码中的background属性是我自己定义的,本来QWidget有palette属性,但是我试了下没效果,background定义如下
//h
class MainWindow : public QMainWindow
{
Q_OBJECT
Q_PROPERTY(QColor background READ getBackground WRITE setBackground NOTIFY backgroundChanged)
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QColor getBackground() const;
void setBackground(const QColor &color);
signals:
void backgroundChanged();
private:
Ui::MainWindow *ui;
};
//cpp
QColor MainWindow::getBackground() const
{
return palette().color(QPalette::Background);
}
void MainWindow::setBackground(const QColor &color)
{
setPalette(color);
emit backgroundChanged();
}
运行后可以看到背景色逐渐变化
二、Qt Quick 问题交流
1.QML设置黑体乱码
Qt5.12.5+MSVC/MinGW,设置字体为黑体时会导致中文乱码,奇怪的是乱码的不一定是设置字体的控件。设置renderType: control.renderType后乱码消失了,但不保证所有情况都有效,待验证。
//Cpp main全局设置
QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering);
//或者Qml 每个控件设置
renderType: Text.NativeRendering
也有可能设置bold为true,或者修改weight属性后乱码没了。
(2019-12-4)今天发现了新的情况,宋体和黑体一起使用的时候会出现乱码(我这一般是后设置那个乱码),加了bold为true就没有乱码了:
没办法,还是设置全局的NativeTextRendering吧。
2.QML text带中文,每次打开项目会有预计符号的红色警告
QML的text赋值中有中文的话,每次打开项目就一堆预计符号的红色感叹号
如果是自定义组件里text带中文,调用的地方还会出现M300的警告(M300可以在调用头上加注释去掉警告//@disable-check M300)
奇怪的是这时候打开有问题的文件,等一会儿,或者点构建/qmake/运行警告又消失了。也有可能不会消失,这时候保存下有问题的文件(或者修改后保存)问题也消失了。
(2021-5-12 补充)
参照 Qt Bug:https://bugreports.qt.io/browse/QTCREATORBUG-15774
一般可以把 qml 文件设置为 utf8-bom,这样加载时就能正确的识别。
但是,还有但是,我用 qsTr().arg() 拼接字符串时,如果配置为 MinGW-debug-utf8-bom,会出现 Controls 模块加载错误,测试 release 或者 MSVC 正常。
3.DropShadow阴影和目标放在同一个Row中时,布局被打乱
可以将两者用一个Item包裹起来放在Row中