QML GridLayout不遵守我指定的单元格安排

时间:2016-03-15 09:19:33

标签: qt qml qtquick2 qt5.5

在此代码中,某些项目最初是不可见的。我希望点击按钮在我们放置它们的位置时可以看到它们。

为了给他们留出空间,当隐藏的选项可见时,我已将其他项目放在将要显示的位置。

我的问题是当其他项目不可见时,public class Splash extends Activity { SharedPreferences sharedpreferences; boolean splash; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); sharedpreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); splash = sharedpreferences.getBoolean("Splash", false); if (splash == true) { Intent mainIntent = new Intent(Splash.this, MainActivity.class); startActivity(mainIntent); } else { setContentView(R.layout.splash); //animation ImageView imageView = (ImageView) findViewById(R.id.imageView); Animation alpha = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in); imageView.startAnimation(alpha); alpha.setAnimationListener((new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Start your activity here. SharedPreferences.Editor editor = sharedpreferences.edit(); editor.putBoolean("Splash", true); Intent mainIntent = new Intent(Splash.this, MainActivity.class); Splash.this.startActivity(mainIntent); Splash.this.finish(); } })); } } } 不遵守代码中设置的以下单元格位置。

GridLayout

输出:

当所有项目都可见时:

enter image description here

当隐藏其他两个项目时,import QtQuick 2.4 import QtQuick.Window 2.2 import QtQuick.Layouts 1.1 Window { visible: true height: 500; width: 500 GridLayout { id: gridLayout property bool secondScreenOptionsVisible: false property int hmmiButtonRow: 0 property int hmmiButtonCol: 0 Rectangle { id: hmmi; visible: gridLayout.secondScreenOptionsVisible Layout.row: gridLayout.hmmiButtonRow; Layout.column: gridLayout.hmmiButtonCol; height: 50; width: 50; color: "pink"; Layout.alignment: Qt.AlignTop Text { text: "HMMI"; anchors.centerIn: parent } } property int optionsButtonRow: 1 property int optionsButtonCol: 0 Rectangle { id: optionsButton; visible: gridLayout.secondScreenOptionsVisible Layout.row: gridLayout.optionsButtonRow; Layout.column: gridLayout.optionsButtonCol; height: 50; width: 50; color: "red" Layout.alignment: Qt.AlignTop Text { text: "Options..."; anchors.centerIn: parent } } property int flipperControlRow: 3 property int flipperControlCol: 0 Rectangle { id: flipperControl; Layout.row :gridLayout.flipperControlRow; Layout.column: gridLayout.flipperControlCol; height: 200; width: 50; color: "brown"; Layout.rowSpan: 4 Layout.alignment: Qt.AlignTop Text { text: "Flipper"; anchors.centerIn: parent } } } } 不遵守规则。

enter image description here

我希望GridLayout能够遵守我设定的单元格位置,无论其他项目是否可见。

请帮忙。

1 个答案:

答案 0 :(得分:3)

文档说GridLayout

  

[...]它类似于基于小部件的QGridLayout。 GridLayout元素的所有可见子元素都属于布局。 [...]。

因此,您所看到的是开发人员遵循的实施方法的直接后果。实际上,可见性的变化会触发Item的重新定位,如this代码路径中所示。

您可以使用visible属性而不是考虑opacity属性:布局会考虑非不透明Item,从而产生预期的可见行为。例如,参见这个简单的例子:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1

Window {
    visible: true
    height: 400; width: 400

    GridLayout {
        anchors.fill: parent
        id: gridLayout
        rows: 3
        columns: 3

        Repeater {
            id: rep
            model: 9

            Rectangle {
                color: "black"
                Layout.preferredWidth: 100
                Layout.preferredHeight:  100
                Layout.alignment: Qt.AlignCenter
                opacity: index === rep.count - 1
            }
        }
    }
}

请注意,非透明Item仍会呈现,与不可见的SELECT * FROM tblname Order By datecol,status 不同,对性能有不同程度的影响,具体取决于您的实际使用情况。