C++ Qt5-QML:按钮在触发后不显示
我正在写一个使用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点上看到它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,那么返
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
}
}
}