QML:居中变量文本和图像
我需要在一个大框(绿色框)中水平居中一个可变长度的文本(红色框)和一个图像(黄色框)。如果文本与方框不符,则应将其包裹起来 现行守则:QML:居中变量文本和图像,qml,qtquick2,Qml,Qtquick2,我需要在一个大框(绿色框)中水平居中一个可变长度的文本(红色框)和一个图像(黄色框)。如果文本与方框不符,则应将其包裹起来 现行守则: Item { id: bigBox x: 255 y: 0 width: 800 height: 100 Image { id: imageBox source: "image.png" width: 52 height: 46 an
Item {
id: bigBox
x: 255
y: 0
width: 800
height: 100
Image {
id: imageBox
source: "image.png"
width: 52
height: 46
anchors.left: parent.left
anchors.leftMargin: 12
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Image.AlignLeft
verticalAlignment: Image.AlignVCenter
fillMode: Image.Pad
}
Text {
id: textBox
anchors.left: symbol.right
anchors.leftMargin: 12
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: qsTr("heading text")
font.pixelSize: 36
font.bold: true
horizontalAlignment: Text.AlignCenter
}
}
更新:
实际运行的代码和显示问题的真实屏幕截图:
import QtQuick 2.0
Rectangle {
id: mask
x: 0
y: 0
width: 800
height: 430
color: "#FFFFFF"
property int pageState: 0
Rectangle {
x: 0
y: 0
width: 111
height: 100
color: "#0000FF"
}
Item {
id: whitespace
x: 117
y: 0
width: 800-x
height: 100
Row {
anchors.centerIn: parent
Image {
id: symbol
source: "../img/pepper.png"
width: 52
height: 46
anchors.verticalCenter: parent.verticalCenter
fillMode: Image.Pad
}
Text {
id: heading
property var texts: ["Active Blabla","Active Blaaaaaaah Blaaaah ","Active Blabla and Blaaaaaaah Blaaaah"]
anchors.verticalCenter: parent.verticalCenter
color: "#333191"
text: texts[pageState]
font.family: "Liberation Sans"
font.pixelSize: 36
font.bold: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
textFormat: Text.PlainText
width: Math.min(150,contentWidth)
}
}
}
Rectangle {
id: stage
x: 0
y: 106
width: parent.width
height: parent.height-y
color: "#FFFF00"
}
Timer {
interval: 1000 // milliseconds
triggeredOnStart: true
repeat: true
running: true
onTriggered: {
pageState=(pageState+1)%3;
}
}
}
右上角的白色区域是第一张图片中的绿色框。计时器只是在这三个文本中运行,就像真正的应用程序一样
将Math.min()的第一个参数更改为600不会改变任何东西。我的一套解决该问题的方法:
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.2
Item {
id: bigBox
width: 800
height: 100
Row {
anchors.centerIn: parent
Image {
anchors.verticalCenter: parent.verticalCenter
source: "blue.png"
}
Text {
anchors.verticalCenter: parent.verticalCenter
// maximum width of the text
width: Math.min(150, contentWidth)
text: qsTr("heading")
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
}
}
}
Item {
// ...
Text {
function escapeHTML(text)
{
return text.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""");
}
function toHTML(imageUrl,text)
{
var textlines=escapeHTML(text).replace(/\r?\n/,"\n").split("\n");
var retval="<center>";
retval=retval+'<table><tr>';
if (imageUrl!="") {
retval=retval+'<td rowspan="'+(textlines.length)+'"><img src="'+imageUrl+'"></td>';
retval=retval+'<td rowspan="'+(textlines.length)+'"> </td>';
}
for (var i=0; i<textlines.length; i++) {
if (i>0) {
retval=retval+"<tr>";
}
retval=retval+'<td>'+textlines[i]+'</td></tr>';
}
retval=retval+'</table>';
retval=retval+"</center>";
return retval;
}
anchors.fill: parent
verticalAlignment: Text.AlignVCenter
textFormat: Text.RichText
text: toHtml("../img/pepper.png",qsTr("heading"))
}
}
项目{
// ...
正文{
函数escapeHTML(文本)
{
返回文本。替换(//&/g,“&;”)。替换(//g,”)。替换(//“/g,”);
}
函数toHTML(图像URL、文本)
{
var textlines=escapeHTML(text).replace(/\r?\n/,“\n”).split(“\n”);
var retval=“”;
retval=retval+'';
如果(imageUrl!=“”){
retval=retval+'';
retval=retval+'';
}
对于(var i=0;i0){
retval=retval+“”;
}
retval=retval+''+文本行[i]+'';
}
retval=retval+'';
retval=retval+“”;
返回返回;
}
锚定。填充:父级
垂直对齐:Text.AlignVCenter
Text格式:Text.RichText
文本:toHtml(“../img/pepper.png”,qsTr(“标题”))
}
}
将文本居中于可用空间,但不居中于图像 (它保持在左边-臭虫!)李>
可以通过
居中,并且它可以包含 形象- 包装无法按预期工作,因此已翻译文本返回
by
必须在正确的位置包含换行符qsTr()
在换行符处拆分,并由此生成表行李>toHTML()
- 图像需要具有
的表格单元格,否则图像相对于文本的位置过高李>行span
- 最后,
将所有这些内容垂直居中放置——幸好我不需要表格边框。(如果您感到无聊,请将verticalAlignment:Text.AlignVCenter
添加到border=1
标记。)
不,由
Text.RichText
支持的HTML和CSS子集不支持垂直对齐。渲染引擎的工作方式与古代浏览器类似,您必须像1996年一样堆叠黑客和变通方法。基本上可以工作,但需要一些微调(问题中省略了一些细节)。谢谢哦,对不起,不,它没有按预期工作。文本太小,并从绿色框的顶部和底部断开。将Math.min中的幻数调整为较大的值会使较短文本的居中位置中断。这就像您使用的是Math.max
而不是Math.min
。或者添加红/绿框会改变什么?你能更新代码示例吗?我知道为什么会这样。当文本被更新时,它将被包装为当前宽度,因此contentWidth永远不会变大,宽度的重新计算也永远不会进行。现在想不出一个非黑客的解决方案。。。