Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt5-QML:按钮在触发后不显示_C++_Qt_Qml_Qt5_Qbuttongroup - Fatal编程技术网

C++ Qt5-QML:按钮在触发后不显示

C++ Qt5-QML:按钮在触发后不显示,c++,qt,qml,qt5,qbuttongroup,C++,Qt,Qml,Qt5,Qbuttongroup,我正在写一个使用Qt5 QML的项目。为了缩小这个问题,我准备了一个复制这个问题的小例子 我在一页上有一份申请。它带有一个按钮,如下面的打印屏幕所示: 2用户按下按钮后,将进入下面显示的第2页,其中包含不同的按钮。假设按钮A是用户的选择: 3由Page1表示的最终屏幕是正确的选择,即所选的按钮 我的问题是,在用户选择了第2点的选择并返回到页面1之后,在页面1的中间出现一个按钮,打开一个对话框窗口,在我的例子中,WebGeNeNeWW只与那个按钮有关。 当然,如果用户选择了第2页上的按钮3,那么返

我正在写一个使用Qt5 QML的项目。为了缩小这个问题,我准备了一个复制这个问题的小例子

我在一页上有一份申请。它带有一个按钮,如下面的打印屏幕所示:

2用户按下按钮后,将进入下面显示的第2页,其中包含不同的按钮。假设按钮A是用户的选择:

3由Page1表示的最终屏幕是正确的选择,即所选的按钮

我的问题是,在用户选择了第2点的选择并返回到页面1之后,在页面1的中间出现一个按钮,打开一个对话框窗口,在我的例子中,WebGeNeNeWW只与那个按钮有关。 当然,如果用户选择了第2页上的按钮3,那么返回第1页时,应该会有另一个按钮打开与按钮3相关的另一个对话框,该按钮始终是WebEngineView

我看不到按钮和相关对话框

预期结果是下面的打印屏幕:

下面是出现问题的代码片段:

main.qml

第1.qml页

第2.qml页

到目前为止,我尝试的是:

1我遇到了以下内容,这些内容有助于理解组件的样式。这就是我在代码中使用Component.onCompleted:的原因。这在第2页的按钮触发方面做得很好。我想我也可以对其他人使用同样的哲学,但他们没有出现

2有助于我理解组件的属性,特别是在示例中如何在单击时高亮显示。我认为这是我所能找到的最接近我所做的事情

3进一步挖掘我试图实现的目标,我继续浏览了官方文档,这些文档似乎推动了对属性onCurrentItemChanged的使用,这可能是触发信号发射属性的一种选择

更新

main.qml中的以下部分用于显示,一旦用户触发三个按钮中的一个,则在第1页上会显示单击的按钮的字母,事实上,可以在过程的第3点上看到它

Component.onCompleted: {
        page2.onButtonClicked.connect(function(buttonId, buttonName) {
            page1.mytext.text = buttonId;
            page1.mytext.text = buttonName;
            mystackview.pop();
        });
它连接到page2.qml上的信号,如下所示:

signal onButtonClicked(var buttonId, var buttonName)
返回QML应用程序的第1页后,为什么看不到该按钮?
非常感谢您指出解决此问题的正确方向。

正如我在评论中提到的,打开对话框按钮始终隐藏在堆栈视图中。如果它们没有被隐藏,那么无论如何,它们都需要一些标志,根据第2页的选择来指示它们是否应该可见

与您的MRE的现有结构保持一致,这里有一种方法可以工作。我将“打开”对话框按钮移到了第1页,因为这似乎是最有意义的,但它们也可以位于某个单独的页面上,或者合并到main.qml中(如果存在允许这样做的布局)。另外,我从Page1建立了一个信号/插槽连接,以触发main.qml中的Page2加载,而不是直接尝试访问main.qml中的对象,这是一种糟糕的做法。我还从Page1中删除了文本标签以简化代码。Page2代码保持不变,因此我不包括它

main.qml

第1.qml页


为什么page1.mytext.text=buttonId;page1.mytext.text=按钮名称;?我只是检查是否按下了正确的按钮,事实上我抓取了在第2页触发的按钮的id和名称,并在第1页上显示为双重检查。可以理解的是,MRE不应该有这些元素,因为它们是干扰分析的噪音。你不认为引入这种类型的噪声是不必要的吗?buttonId和buttonName变量提供了什么信息?我认为person类的代码是不必要的,只是更多的噪声,因为说这种代码对我有效根本没有帮助。谢谢你花时间阅读这个问题。您的解决方案可以工作并运行,但不幸的是,在单击第2页的选项A后,我仍然无法看到第1页的按钮打开对话框A。我不明白这是否是由于StackView造成的。@Emanuele我添加了我在qmlscene应用程序中看到的运行的屏幕截图。如果您没有得到相同的结果,那么您可能没有运行相同的代码,或者存在其他一些我不知道的差异,抱歉。抱歉,这是一个复制/粘贴问题!。它的工作原理和你描述的一模一样。我知道你是如何组织和纠正这个例子的。最重要的是,我知道应该如何调用对话框。附加信号选择对话框这是一个好主意。非常感谢您的帮助!:
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12

Page {
    signal onButtonClicked(var buttonId, var buttonName)

    Component.onCompleted: {
        button1.clicked.connect(function() {
            onButtonClicked(1, "A");
        });
        button2.clicked.connect(function() {
            onButtonClicked(2, "B");
        });
        button3.clicked.connect(function() {
            onButtonClicked(3, "C");
        });
    }

    ColumnLayout {
        id: mybuttons
        anchors.fill: parent
        spacing: 5
        Button {
            id: button1
            Layout.fillWidth: true
            Layout.fillHeight: true
            text: "A"
        }
        Button {
            id: button2
            Layout.fillWidth: true
            Layout.fillHeight: true
            text: "B"
        }
        Button {
            id: button3
            Layout.fillWidth: true
            Layout.fillHeight: true
            text: "C"
        }
    }
Component.onCompleted: {
        page2.onButtonClicked.connect(function(buttonId, buttonName) {
            page1.mytext.text = buttonId;
            page1.mytext.text = buttonName;
            mystackview.pop();
        });
signal onButtonClicked(var buttonId, var buttonName)
import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Conn")
    property Page1 page1: Page1 {}
    property Page2 page2: Page2 {}

    Component.onCompleted: {
        page1.selectDialog.connect(function()  {
            mystackview.push(page2);
        });

        page2.onButtonClicked.connect(function(buttonId, buttonName) {
            page1.dialogId = buttonId;
            mystackview.pop();
        });
    }

    StackView {
        id: mystackview
        anchors.fill: parent
        initialItem: page1
    }
}
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12

Page {

    property int dialogId: -1;

    signal selectDialog()

    ColumnLayout {
        anchors.fill: parent
        spacing: 5

        Button {
            id: button1
            text: "Select"
            onClicked: selectDialog()
            Layout.fillWidth: true
        }

        // These buttons should appear only after the user selects the choices on `Page2`
        Button {
            id: dialogA
            text: "Open Dialog A"
            visible: dialogId === 1
            Layout.fillWidth: true
        }
        Button {
            id: dialogB
            text: "Open Dialog B"
            visible: dialogId === 2
            Layout.fillWidth: true
        }
        Button {
            id: dialogC
            text: "Open Dialog C"
            visible: dialogId === 3
            Layout.fillWidth: true
        }
    }
}