《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/运行警告又消失了。也有可能不会消失,这时候保存下有问题的文件(或者修改后保存)问题也消失了。

//问题待解决

3.DropShadow阴影和目标放在同一个Row中时,布局被打乱

可以将两者用一个Item包裹起来放在Row中


 

发布了95 篇原创文章 · 获赞 26 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/gongjianbo1992/article/details/102803483