使用 StackedWidget 的 FindChild 方法失败
FindChild Method with StackedWidget fails
我在我的 MainWindow class 中使用了 qstackedwidget,并且我在另一个 class (PageLayouts) 中定义了小部件,以便将它们分开。但是我正在 MainWindow class(更改页面...)中的对象之间建立连接,但失败了。基本上:
//mainwindow.cpp
....
QSignalMapper * SM = new QSignalMapper();
Layouter = new PageLayouts();
//Instance of the class which contains the widgets
QStackedWidget * Stack = new QStackedWidget();
Stack->addWidget(Layouter->getPage1());
connect(SM, SIGNAL(mapped(int)), Stack, SLOT(setCurrentIndex(int)));
SM->setMapping(Stack->widget(0)->findChild<QPushButton *>("Btn_ToPage2"), 1);
connect(Stack->widget(0)->findChild<QPushButton *>("Btn_ToPage2"), SIGNAL(clicked(bool)), SM, SLOT(map()));
....
//Debugging says to the first connect:
QObject::connect: Cannot connect (null)::destroyed() to QSignalMapper::_q_senderDestroyed()
//To the second:
QObject::connect: Cannot connect (null)::clicked(bool) to QSignalMapper::map()
我想我没有通过 findchild 方法正确获取按钮。
所以我的问题是:
- 如何在堆叠的小部件中输入小部件的子项?
- 由于我仍在使用 stackedwidgets 进行实验,是否有更优雅的使用方式?
谢谢,塞巴斯蒂安
编辑 1:
这是在 "pagelayouts.h" 中生成 Page1 的代码:
class PageLayouts
{
QWidget * Page1;
QWidget * Page2;
public:
PageLayouts();
//Get
QWidget * getPage1();
....
以及在 "pagelayouts.cpp" 中生成 page1 的代码:
PageLayouts::PageLayouts()
{
//Page1
QHBoxLayout * HL_112 = new QHBoxLayout();
QVBoxLayout * VL_122 = new QVBoxLayout();
QLabel * Lbl_NamePage1 = new QLabel("Page 1");
QPushButton * Btn_ToPage2 = new QPushButton("Page 2");
QPushButton * Btn_Close1 = new QPushButton("Close");
//Assembling of Page1
VL_122->addWidget(Btn_ToPage2);
VL_122->addWidget(Btn_Close1);
HL_112->addWidget(Lbl_NamePage1);
HL_112->addLayout(VL_122);
Page1 = new QWidget();
Page1->setLayout(HL_112);
//Page2
....
}
QWidget* PageLayouts::getPage1()
{
return Page1;
}
你可以看到它是实验代码,但我正在测试 qstackedwidgets 以进一步设计决策,希望有人能解决这个问题。
您正在将 "Btn_ToPage2" 作为名称传递给 QObject::findChild()
。变量的名称是 Btn_ToPage2
,但您没有设置对象名称:
Btn_ToPage2->setObjectName("Btn_ToPage2");
我在我的 MainWindow class 中使用了 qstackedwidget,并且我在另一个 class (PageLayouts) 中定义了小部件,以便将它们分开。但是我正在 MainWindow class(更改页面...)中的对象之间建立连接,但失败了。基本上:
//mainwindow.cpp
....
QSignalMapper * SM = new QSignalMapper();
Layouter = new PageLayouts();
//Instance of the class which contains the widgets
QStackedWidget * Stack = new QStackedWidget();
Stack->addWidget(Layouter->getPage1());
connect(SM, SIGNAL(mapped(int)), Stack, SLOT(setCurrentIndex(int)));
SM->setMapping(Stack->widget(0)->findChild<QPushButton *>("Btn_ToPage2"), 1);
connect(Stack->widget(0)->findChild<QPushButton *>("Btn_ToPage2"), SIGNAL(clicked(bool)), SM, SLOT(map()));
....
//Debugging says to the first connect:
QObject::connect: Cannot connect (null)::destroyed() to QSignalMapper::_q_senderDestroyed()
//To the second:
QObject::connect: Cannot connect (null)::clicked(bool) to QSignalMapper::map()
我想我没有通过 findchild 方法正确获取按钮。 所以我的问题是:
- 如何在堆叠的小部件中输入小部件的子项?
- 由于我仍在使用 stackedwidgets 进行实验,是否有更优雅的使用方式?
谢谢,塞巴斯蒂安
编辑 1:
这是在 "pagelayouts.h" 中生成 Page1 的代码:
class PageLayouts
{
QWidget * Page1;
QWidget * Page2;
public:
PageLayouts();
//Get
QWidget * getPage1();
....
以及在 "pagelayouts.cpp" 中生成 page1 的代码:
PageLayouts::PageLayouts()
{
//Page1
QHBoxLayout * HL_112 = new QHBoxLayout();
QVBoxLayout * VL_122 = new QVBoxLayout();
QLabel * Lbl_NamePage1 = new QLabel("Page 1");
QPushButton * Btn_ToPage2 = new QPushButton("Page 2");
QPushButton * Btn_Close1 = new QPushButton("Close");
//Assembling of Page1
VL_122->addWidget(Btn_ToPage2);
VL_122->addWidget(Btn_Close1);
HL_112->addWidget(Lbl_NamePage1);
HL_112->addLayout(VL_122);
Page1 = new QWidget();
Page1->setLayout(HL_112);
//Page2
....
}
QWidget* PageLayouts::getPage1()
{
return Page1;
}
你可以看到它是实验代码,但我正在测试 qstackedwidgets 以进一步设计决策,希望有人能解决这个问题。
您正在将 "Btn_ToPage2" 作为名称传递给 QObject::findChild()
。变量的名称是 Btn_ToPage2
,但您没有设置对象名称:
Btn_ToPage2->setObjectName("Btn_ToPage2");