由于Kuix作者设计理念的影响,所有的widget宽度都是自动增长的,除非它的宽度超过屏幕的宽度,实际上这种做法和一般设计时设定控件宽度的模式格格不入,而且经常性的,会出现输入框(textfield)超出屏幕边界的恶性效果,本文旨在讨论widget的长度是如何控制的,什么时候系统会自动计算窗口的布局情况。
widget虽然后width属性,但是它是不可以赋值的,这一点在修改TextArea中文断行时一直对它颇为迷惑。实际上直接查找Widget的width什么时候被修改是有些困难的,setBounds函数似乎是有这个效果,而且是共用的,实际上它只在Desktop中被调用,用于设置窗口或者说系统屏幕的大小。实际上所有控件的大小都是基于其中所包含的子控件的大小,而最终都基于Text的width,实际上Text的width则是在getPreferredSize计算出来,调用顺序为,需要刷新时,执行layou.dolayout>measure>getPreferredSize,当然不同的layout具体计算位置的算法有所不同。
/* (non-Javadoc)
* @see org.kalmeo.kuix.widget.Widget#getPreferredSize(int)
*/
public Metrics getPreferredSize(int preferredWidth) {
Metrics metrics;
if (needToComputePreferredSize(preferredWidth)) {
metrics = super.getPreferredSize(preferredWidth);
String text = getText();
Font font = getFont();
if (font != null) {
if (text != null) {
metrics.width += font.stringWidth(text);
} else {
metrics.width += font.charWidth(' ');
}
metrics.height += font.getHeight();
}
} else {
metrics = getCachedMetrics();
}
return metrics;
}
当某个widget修改大小或者包含widget时,比如,text.setText,执行顺序如下settext>invalidate>parent.invalidate,逐级向上调用invalidate直到Desktop,调用KuixCanvas.revalidateNextFrame,读过《关于Kuix的窗口刷新机制》可以知道,此时会等待worker线程执行forceRevalidate>desktop.revalidate()>doLayout进行重新计算布局,进而调用forceRepaint重绘窗口
public boolean run() {
if (needToChangeSize) {
forceSizeChanged(desiredWidth, desiredHeight);
}
if (sizeInitialized) {
// Key events, Pointer events and revalidation are execute only if transition is not running
if (!transitionRunning) {
// Key events
if (!keyEvents.isEmpty()) {
synchronized (this) {
for (int i = 0; i < keyEvents.size(); ++i) {
int[] keyEvent = ((int[]) keyEvents.elementAt(i));
FocusManager focusManager = desktop.getCurrentFocusManager();
if (focusManager != null && focusManager.processKeyEvent((byte) keyEvent[0], keyEvent[1])) {
repaintNextFrame();
}
}
}
keyEvents.removeAllElements();
}
// Pointer events
if (!pointerEvents.isEmpty()) {
synchronized (this) {
for (int i = 0; i < pointerEvents.size(); ++i) {
int[] pointerEvent = ((int[]) pointerEvents.elementAt(i));
FocusManager focusManager = desktop.getCurrentFocusManager();
if (focusManager != null && focusManager.processPointerEvent((byte) pointerEvent[0], pointerEvent[1], pointerEvent[2])) {
repaintNextFrame();
} else if ((byte) pointerEvent[0] == KuixConstants.POINTER_DROPPED_EVENT_TYPE) {
if (desktop.getDraggedWidget() != null) {
desktop.removeDraggedWidget(true);
}
}
}
}
pointerEvents.removeAllElements();
}
// Revalidate if needed
if (needToRevalidate) {
forceRevalidate();
}
}
// Repaint
if (needToRepaint) {
forceRepaint();
}
}
return false;
}
};
实际上要设定控件的固定宽度,最好是从widget的底层修改,增加fixWidth属性,在属性有赋值时强制固定大小,并且针对性的对于继承的控件。
分享到:
相关推荐
"Qt界面获取Widget位置大小并与其他Widget切换位置大小"这个主题涉及到如何动态地改变和管理Widget的位置和尺寸,以及如何通过交互来实现它们之间的切换。在VS2013环境下开发Qt应用时,这些操作对于创建灵活、响应式...
本文将详细讲解如何实现QT Widget控件的自适应窗口大小以及调整其比例。 首先,我们需要了解QT中的布局管理器(Layout Manager),如QVBoxLayout、QHBoxLayout和QGridLayout等。这些布局管理器可以帮助我们自动调整...
在本文中,我们将深入探讨AppWidget的基本概念、工作原理以及如何创建一个简单的AppWidget。 1. **AppWidget的基本概念** - AppWidget并非独立的应用程序,而是主应用的一部分,通过`AppWidgetProvider`类与宿主...
本报告旨在分析当前移动Widget的市场状况,探讨其起源和发展历程,以及典型成功案例,为运营商提供策略建议。 【详细内容】: 1. **Widget定义及特点** Widget是一种基于HTML、JavaScript、Flash或iframe的小工具...
本篇将深入探讨如何在自定义的Launcher中添加Widget,并通过源码分析来理解这一过程。 首先,我们来看“android Launcher添加widget”的核心概念。在Android中,Widget是一种轻量级的应用组件,可以在用户的主屏幕...
本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`appWidget`的基本构成。一个`appWidget`通常包含一个或多个`RemoteViews`,它们是显示在主屏幕上的视图组件。`RemoteViews`允许...
在深入探讨Android AppWidget之前,我们首先需要理解AppWidget在Android生态中的角色和价值。AppWidget,即桌面小部件,是Android系统提供的一种允许应用程序在主屏幕放置动态更新的组件,用户无需打开完整应用即可...
本文将深入探讨如何在Qt5及更高版本中动态地向父Widget添加子Widget,以及相关的C++编程技巧。 首先,我们来了解Qt中的Widget。Widget是Qt GUI系统的基础,它代表了屏幕上可见的任何元素,如按钮、文本框等。在Qt中...
本教程将深入探讨如何制作Widget工具,涉及的关键知识点包括开发环境搭建、编程语言选择、设计原则以及发布流程。 一、开发工具选择 制作Widget工具首先需要合适的开发工具。对于桌面Widget,可能需要如Adobe Air...
1. **需求分析**: 确定Widget的功能、目标用户和使用场景。 2. **设计阶段**: 设计Widget的UI界面,包括布局、颜色、字体等元素,并制定交互逻辑。 3. **编程实现**: 使用合适的编程语言(如Java、Swift或Kotlin)...
在本篇内容中,我们将深入探讨如何创建一个Android桌面小窗口Widget,并通过"android 桌面小窗口 widget demo"来实践。 首先,我们需要了解Android Widget的基本组成和工作原理。Widget主要由以下几部分构成: 1. ...
- **Widget大小**:在布局文件中,我们可以通过定义`<appwidget-provider>`标签的`minWidth`和`minHeight`属性来设定Widget的最小尺寸。 - **点击事件处理**:可以为Widget中的View元素设置点击事件,通常通过...
本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小组件的代码和资源。 1. **Widget组件概述** - Android Widget是Android系统中的一个...
本文将深入探讨如何在Qt中设置`QWidget`的大小,以及相关的布局管理。 首先,`QWidget`类提供了几个方法来控制其大小: 1. `setGeometry(int x, int y, int width, int height)`: 这个方法允许我们直接设置`...
本篇文章将深入探讨Android中的Widget组件,包括ConfigWidget、ServiceWidget和SimpleWidget。 首先,我们来看ConfigWidget。ConfigWidget通常指的是配置Widget,它允许用户自定义Widget的某些属性或设置。例如,...
下面我们将详细探讨Brew Widget及其开发中的关键知识点。 首先,我们需要理解Brew Widget是什么。Brew Widget可能是指一个自定义的小部件库,它扩展了原生平台的UI元素,使开发者能够快速构建具有独特交互和视觉...
让我们深入探讨一下Android Widget的相关知识点。 1. **Widget基础**: - Android Widget是Android操作系统提供的桌面组件,可以是时钟、天气预报、音乐播放控制等,它们在主屏幕上提供直观、便捷的交互。 - ...
`meta-data`标签则用来指定Widget的元数据,通常包含在`res/xml`目录下的一个XML文件,这个文件包含了关于Widget的更多详细信息。 3. **编写XML provider文件**: 这个XML文件(如`info.xml`)定义了Widget的大小...
本文将深入探讨Android AppWidget的第四部分,主要关注如何更新AppWidget中的控件,以及相关的源码和工具。 **一、AppWidget更新机制** 1. **AppWidgetProvider**: 这是所有AppWidget的核心组件,它是一个...
在本文中,我们将深入探讨如何在Qt环境中使用StackWidget实现优雅的页面切换动画,从而提升应用的用户体验。StackWidget是Qt提供的一种方便的容器控件,用于管理多个子窗口或Widget,并在它们之间进行平滑的过渡。让...