gpt4 book ai didi

Qt - 调用小部件父的插槽

转载 作者:行者123 更新时间:2023-12-04 12:49:59 25 4
gpt4 key购买 nike

我编写了一个小程序来测试访问小部件父级插槽。基本上,它有两个类:

小部件:

namespace Ui
{
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
Widget(QWidget *parent = 0);
~Widget();
QLabel *newlabel;
QString foo;

public slots:
void changeLabel();

private:
Ui::Widget *ui;
};

Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
customWidget *cwidget = new customWidget();
newlabel = new QLabel("text");
foo = "hello world";
this->ui->formLayout->addWidget(newlabel);
this->ui->formLayout->addWidget(cwidget);

connect(this->ui->pushButton,SIGNAL(clicked()),cwidget,SLOT(callParentSlot()));
connect(this->ui->pb,SIGNAL(clicked()),this,SLOT(changeLabel()));
}

void Widget::changeLabel(){
newlabel->setText(this->foo);
}

和自定义小部件:
class customWidget : public QWidget
{
Q_OBJECT
public:
customWidget();
QPushButton *customPB;

public slots:
void callParentSlot();
};

customWidget::customWidget()
{
customPB = new QPushButton("customPB");
QHBoxLayout *hboxl = new QHBoxLayout();
hboxl->addWidget(customPB);
this->setLayout(hboxl);
connect(this->customPB,SIGNAL(clicked()),this,SLOT(callParentSlot()));
}

void customWidget::callParentSlot(){
((Widget*)this->parentWidget())->changeLabel();
}

在主函数中,我简单地创建了一个 Widget 实例,并在其上调用了 show()。这个 Widget 实例有一个标签、一个 QString、一个 customWidget 类的实例和两个按钮(在 ui 类中,pushButton 和 pb)。其中一个按钮在其自己的类中调用一个名为 changeLabel() 的槽,顾名思义,它将标签更改为其中包含的 QString 中设置的任何内容。我这样做只是为了检查 changeLabel() 是否有效。这个按钮工作正常。另一个按钮调用 customWidget 实例中的一个名为 callParentSlot() 的槽,该槽依次尝试调用其父级中的 changeLabel() 槽。因为在这种情况下,我知道它的父级实际上是 Widget 的一个实例,所以我将 parentWidget() 的返回值转换为 Widget*。此按钮使程序崩溃。我在 customWidget 中创建了一个按钮来尝试调用 customWidget 的父插槽,但它也会使程序崩溃。我关注了 this 上的内容问题。我错过了什么?

最佳答案

你从来没有为你的 customWidget 设置父窗口小部件。实例。所以,this->parentWidget()很可能返回一个 NULL 指针。进行以下更改:

customWidget *cwidget = new customWidget(this);
...
customWidget(QWidget *parent);
...
customWidget::customWidget(QWidget *parent) : QWidget(parent)

我还建议使用 dynamic_cast 并检查返回值。这可以防止您在 parent 为 NULL 和 parent 不属于正确类的情况下崩溃。
void customWidget::callParentSlot()
{
Widget *w = dynamic_cast<Widget *> (this->parentWidget());
if (0 != w)
w->changeLabel();
/* else handle the error */
}

另一种方法是通过信号和槽接口(interface)调用父槽。将新的 customWidget 信号连接到 Widget 构造函数中的 Widget 插槽。然后您可以从 customWidget 调用插槽,如下所示。
emit callParentSignal();

关于Qt - 调用小部件父的插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com