繁体   English   中英

Qt操作将无法连接到插槽

[英]Qt action won't connect to slot

用c ++和qt编写学校项目。 它应该是一个块编辑器(如draw.io)。 我将块生成为按钮并将其设置为网格。 每个按钮都应该具有自己的菜单,以便能够进行编辑,删除等操作(图片示例:

在此处输入图片说明

我们遇到问题,我们的操作无法连接到插槽。 假定函数akceAkce仅将1打印到输出(通过qInfo)。 但是,当我单击菜单按钮时,它什么也没做。 任何建议表示赞赏。 谢谢!

void BlockItem::createButton() {

    this->button = new QPushButton("+");

    this->buttonMenu = new QMenu(this->button);

    this->connectBlocks = new QAction(tr("Connect"), this->buttonMenu);

    connect(this->connectBlocks, &QAction::triggered, this, &BlockItem::akceAkce);

    this->buttonMenu->addAction(this->connectBlocks);


    this->button->setMenu(this->buttonMenu);
}

void BlockItem::akceAkce() { 
    qInfo("1"); 
}

我建议一个可能的解释:将BlockItem实例放到堆栈上,它超出了代码范围,然后销毁了它,而按钮,菜单和操作全部都保留了下来,因为它们是用new实例化的。 ,因此它们生活在堆中。

像这样:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    BlockItem blockitem;
    blockitem.createButton();

    ui->gridLayout->addWidget(blockitem.getButton());
}

在上面的示例代码中,方法结束时, blockitem超出了范围,因此它被破坏了,连接丢失了接收方(即中断)。

如果您使用new实例化堆上的BlockItem对象,但意外地将其删除,则会发生同样的情况。 同样,信号发送器( QAction对象)在接收器中幸存下来,并且连接断开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM