QObject :: connect: сигнал не найден в продвинутом виджете с лямбда-синтаксисом - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть перегруженный класс QTreeWidget с моими СИГНАЛАМИ: я повысил его в своем пользовательском интерфейсе, и когда я слушаю продвинутый объект QTreeWidget с лямбда-синтаксисом, у меня возникает ошибка.

QObject::connect: signal not found in CustomTreeWidget.

МОЙ CustomTreeWidget выглядит так:

.h

class CustomTreeWidget : public QTreeWidget
{
    Q_OBJECT
public:
    explicit CustomTreeWidget(QWidget *parent = 0);

    ~CustomTreeWidget() {
    }

signals:
    void currentNodeChanged(QSet<int> uids);
    void deleteRequest(QVector<int> uids);
}

.cpp

CustomTreeWidget::CustomTreeWidget(QWidget *parent) : QTreeWidget(parent)
{
    setAnimated(true);

    connect(this, &CustomTreeWidget::customContextMenuRequested, this, [=](const QPoint &pos) {
        this->m_bCustomMenuOpen = true;
        const auto &&item = this->itemAt(pos);

        QMenu myMenu;

        bool ok = !(item) ? false : true;

        if (ok) {
        //თუ topLevelItem -ია მხოლოდ დამატების action -ი უნდა იყოს ჩართული.
            if (item == this->topLevelItem(0) || item == this->topLevelItem(0)->child(0)) {
                ok = false;
            }
        }

        QAction *Removecnt = myMenu.addAction(tr("&წაშლა"), this, SLOT(DeleteNode()));
        Removecnt->setIcon(QIcon(":/global_res/delete.png"));
        Removecnt->setEnabled(ok);

        myMenu.exec(this->mapToGlobal(pos));
    });
}

void CustomTreeWidget::BFS(QTreeWidgetItem *item, QSet<int> &out)
{
    std::queue<QTreeWidgetItem *> Q;
    Q.push(item);

    while (!Q.empty()) {
        QTreeWidgetItem *now = Q.front(); Q.pop();
        out.insert(this->m_mapUids[now]);
        for (int i = 0; i < now->childCount(); i++) {
            Q.push(now->child(i));
        }
    }
}

QSet<int> CustomTreeWidget::GetCurrentNodeUids()
{
    QSet<int> uids;
    if (!this->currentItem())
        return uids;

    this->BFS(this->currentItem(), uids);
    return uids;
}

void CustomTreeWidget::DeleteNode()
{
    QSet<int> nodes = this->GetCurrentNodeUids();
    QVector<int> uids;
    for (auto it : nodes) {
        uids.push_back(it);
    }

    emit deleteRequest(uids);
}

Моя лямбда выглядит так:

connect(ui->productTree, &CustomTreeWidget::deleteRequest, this, [=](QVector<int> uids) {
    //logic
});

Но этот сигнал работает со старым синтаксисом.

connect(ui->productTree, SIGNAL(deleteRequest(QVector<int>)), this, SLOT(checkSlot(QVector<int>)));

А этот слот есть.

void ProductForm::checkSlot(QVector<int> uids)
{
    qDebug() << uids.size();
}

Так в чем же проблема лямбда-синтаксиса?

1 Ответ

0 голосов
/ 30 апреля 2018

Это пахнет как нарушение правила одного определения (ODR) - возможно, из-за устаревшей папки сборки. Проблема в том, что адрес deleteRequest, переданный методу connect, не совпадает с адресом метода, видимого из moc_CustomTreeWidget.cpp. Удалите папку сборки и попробуйте снова. Если это все еще не работает, начните уменьшать свою проблему:

  1. Создайте ветку минимизации в хранилище (если вы не используете контроль версий, вы никуда не денетесь с минимизацией).

  2. Скопируйте и вставьте содержимое файла ui_CustomTreeWidget.h в файл CustomTreeWidget.cpp, удалите строку #include.

  3. Проверьте вставленное содержимое на наличие экземпляра объекта productTree правильного типа.

  4. Если это правильно, то удаляйте все остальное из кода, шаг за шагом, перестраивая и фиксируя хранилище на каждом шаге, который все еще воспроизводится. Вы должны получить тестовый набор длиной не более 20-30 строк. И будет либо очевидно, что не так, либо вы можете изменить вопрос с помощью контрольного примера.

...