Действие Qt не подключится к слоту - PullRequest
0 голосов
/ 03 мая 2018

Написание школьного проекта на c ++ и qt. Предполагается, что это редактор блоков (например, draw.io). Я генерирую блоки в виде кнопок и устанавливаю их в виде сетки. Предполагается, что каждая кнопка имеет собственное меню, которое можно редактировать, удалять и т. Д. (Пример изображения:

enter image description here

Мы столкнулись с проблемой, что наше действие не будет подключено к слоту. Функция 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"); 
}

1 Ответ

0 голосов
/ 03 мая 2018

Я бы предложил возможное объяснение: вы помещаете экземпляр 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 выходит из области видимости в конце метода, поэтому он разрушается и соединение теряет свою принимающую сторону (т.е. разрывается).

То же самое произойдет, если вы создадите экземпляр BlockItem объекта в куче, используя new, но случайно удалите его где-нибудь. И снова отправитель сигнала (объект QAction) остается в живых, и соединение разрывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...