gpt4 book ai didi

c++ - QObject::connect:在使用 Lambda 语法的升级小部件中找不到信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:11 25 4
gpt4 key购买 nike

我有一个重载的 QTreeWidget 类,带有我的信号:我已经在我的 UI 中提升了它,当我使用 lambda 语法收听提升的 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);
}

我的 lambda 看起来像:

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();
}

那么什么是问题 lambda 语法?

最佳答案

这听起来像是违反了单一定义规则 (ODR) - 可能是由于过时的构建文件夹。问题在于传递给 connect 方法的 deleteRequest 地址与 moc_CustomTreeWidget.cpp 中可见的方法地址不同。删除构建文件夹并重试。如果它仍然不起作用,请开始减少您的问题:

  1. 在存储库中创建一个最小化分支(如果您不使用版本控制,您将不会进行最小化)。

  2. ui_CustomTreeWidget.h 文件的内容复制粘贴到 CustomTreeWidget.cpp 文件中,删除 #include 行.

  3. 检查粘贴的内容以使用正确的类型实例化 productTree 对象。

  4. 如果那是正确的,则从代码中删除所有其他内容,逐步重建并在仍然重现的每个步骤中提交到存储库。您最终应该得到一个最多 20-30 行的测试用例。问题很明显,或者您可以使用测试用例修改问题。

关于c++ - QObject::connect:在使用 Lambda 语法的升级小部件中找不到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50096036/

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