《QDebug 2019年10月》

一、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中


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚建波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值