《QDebug 2019年12月》

一、Qt Widgets 问题交流

1.QTableWidget通过setCellWidget添加的带布局的QWidget没铺满

一般setCellWidget设置的如QComboBox、QLineEdit等默认是会铺满的,但是用了一个QWidget加布局的方式,里面的控件却没铺满了,还没找到原因。下图左侧为有布局的,右侧为单一控件。

暂时的做法是给里面的子控件增加一个高度。

2.keyPressEvent函数没有响应方向键

从效果上来看,上下左右方向按键默认是切换各部件焦点,在重载keyPressEvent时按方向按键可能就不会被触发。

方法一,使用setFocusPolicy,但是只有这个设置可能还需要点击或者切换焦点才生效,可以配合setFocus,如:

setFocusPolicy(Qt::StrongFocus);
setFocus(Qt::ActiveWindowFocusReason);

方法二,在keyReleaseEvent种去截获,如:

void Widget::keyPressEvent(QKeyEvent *event)
{
    qDebug()<<"press:"<<event->key();
    switch(event->key())
    {
    case Qt::Key_Up:
    case Qt::Key_Down:
    case Qt::Key_Left:
    case Qt::Key_Right:
        qDebug()<<"yes";
        break;
    }
    QWidget::keyPressEvent(event);
}

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    qDebug()<<"release"<<event->key();
    switch (event->key()) {
    case Qt::Key_Left:
    case Qt::Key_Right:
    case Qt::Key_Up:
    case Qt::Key_Down:
        //event->accept();
        qDebug()<<"yes";
        break;
    default:
        break;
    }
    QWidget::keyReleaseEvent(event);
}

3.在菜单中添加其他控件

有时候想在菜单中添加其他控件,如下拉框等,可以使用QWidgetAction:

#include <QMenu>
#include <QWidgetAction>
#include <QAction>
#include <QComboBox>

...

//创建一个菜单
QMenu *menu=new QMenu;
menu->addAction(new QAction("A",menu));
menu->addAction(new QAction("B",menu));
menu->addSeparator();
//使用QWidgetAction包裹一个下拉框
QWidgetAction *wa=new QWidgetAction(menu);
QComboBox *box=new QComboBox;
box->addItems(QStringList{"1","2","3"});
wa->setDefaultWidget(box);
menu->addAction(wa);
//给按钮设置菜单
ui->btnMenu->setMenu(menu);

尺寸可以设置成固定统一的,这样看起来更协调一点。

二、Qt Quick 问题交流

1.ListView或其他的View获取其中item的属性或方法

有时候想要直接获取Model-View中某个item的值,但是View一般只提供了currentItem的访问接口,如果想要遍历就很麻烦,下面是从网上找的方法:

方法1,用设置currentIndex的方式,不靠谱:

View.currentIndex = index;
View.currentItem.属性/func();

方法2,遍历view的children,但要注意,这种方式遍历的不只是model项对应的view-item项,还包含了因section或highlight等设置而生成的组件:

for(var index=0;i<View.contentItem.children.length;i++)
    View.contentItem.children[index].属性/func();

当然,重度的操作还是使用C++的model来完成比较好 。另外,对于Loader组件,使用item属性就能访问包含的顶层的组件。

参考:https://blog.csdn.net/choujayyl/article/details/80777204

2.QML对某个控件截图

使用Item的 grabToImage 方法,抓取异步发生,抓取完成后将调用 JavaScript 函数回调。

Rectangle {
    id: source
    width: 100
    height: 100
    color: "red"
}
// 原型:bool grabToImage(callback, targetSize)
source.grabToImage(function(result) {
    result.saveToFile("screenshot.png");
});

3.组件尺寸有小数,导致渲染模糊或者其他异常

我在SplitView/ScrollView中发现总有组件看起来很模糊(特别是自绘的),排查半天之后终于发现是设置的尺寸有问题,如果设置为整数就正常了。比如根据某个组件的一半来设置宽度,181一半就是90.5,需要用parseInt取整。

implicitHeight: parseInt(splitview_id.height/2)

4.ScrollView中 的 MouseArea 时拖拽异常

MouseArea 具有 preventStealing 属性,如果设置为 true 可以防止事件被窃取,默认为 false 。

MouseArea{
    anchors.fill: parent
    preventStealing: true
    //...
}

5.Item的旋转/缩放原点设置

transformOrigin 可以设置 Item 的旋转缩放原点,若要设置任意变换原点,请将 scale(缩放) 或 rotation(旋转) 与 transform(变换) 一起使用。

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

猜你喜欢

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