一、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(变换) 一起使用。