gpt4 book ai didi

c++ - QSignal Manager - 无法将多个信号连接到一个插槽

转载 作者:搜寻专家 更新时间:2023-10-31 00:34:38 24 4
gpt4 key购买 nike

我有 4 个 QLineEdits 和 4 个 QPushButtons。如果我点击 QPushButton,我想在相应的 QLineEdit 中设置一些文本。我想使用 QSignalMapper 来区分每个 QButton 及其对应的 QLineEdit,因此如果单击 Button1,我想在 Edit1 中设置文本。

在主窗口的构造函数中,我执行以下操作:

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

// set mapping and pass QLineEdit as parameter
signalMapper->setMapping(ui->btn1, ui->edit1);
signalMapper->setMapping(ui->btn2, ui->edit2);
signalMapper->setMapping(ui->btn3, ui->edit3);
signalMapper->setMapping(ui->btn4, ui->edit4);

// now connect the clicked()-signal to the mapping
connect(ui->btn1, &QPushButton::clicked, signalMapper, &QSignalMapper::map);
connect(ui->btn2, &QPushButton::clicked, signalMapper, &QSignalMapper::map);
connect(ui->btn3, &QPushButton::clicked, signalMapper, &QSignalMapper::map);
connect(ui->btn4, &QPushButton::clicked, signalMapper, &QSignalMapper::map);

// connect signalMapper to my my function
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(setFileName(QObject*)));
}

出于测试目的,我想显示我“链接”到具有此插槽的每个按钮的编辑文本:

void MainWindow::setFileName(QObject* target)
{
QLineEdit* edit = qobject_cast<QLineEdit*>(target);
QMessageBox msgBox;
msgBox.setText(edit->text());
msgBox.exec();
}

但这甚至不能编译,我不明白这个问题: http://pastebin.com/v5sD06yJ

有人可以向我解释一下我的代码有什么问题吗?这是我的项目:https://copy.com/2kDf8Jr0v1if

提前致谢!

最佳答案

您的编译错误可以在新的 connect() 语法下通过强制转换得到解决。所以改变:

connect(
ui->targetfile_btn, &QPushButton::clicked,
signalMapper, &QSignalMapper::map
);
connect(
ui->sourcefile_btn, &QPushButton::clicked,
signalMapper, &QSignalMapper::map
);
connect(
ui->multilizer4_btn, &QPushButton::clicked,
signalMapper, &QSignalMapper::map
);
connect(
ui->multilizer6_btn, &QPushButton::clicked,
signalMapper, &QSignalMapper::map
);

收件人:

connect(
ui->targetfile_btn, &QPushButton::clicked,
signalMapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)
);
connect(
ui->sourcefile_btn, &QPushButton::clicked,
signalMapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)
);
connect(
ui->multilizer4_btn, &QPushButton::clicked,
signalMapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)
);
connect(
ui->multilizer6_btn, &QPushButton::clicked,
signalMapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)
);

它可能比 SIGNAL() 和 SLOT() 宏看起来有点笨拙,但值得在编译时和运行时检查正确兼容的插槽。

如果是我,我会打开 C++11(当然)并编写类似 auto mapSignal = static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map); 的东西然后使用 mapSignal。但还有其他方法。

关于c++ - QSignal Manager - 无法将多个信号连接到一个插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25684479/

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