QSignalManager-无法将多个信号连接到一个插槽
QSignalManager - Cant connect multiple signals to one slot
我有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。但还有其他方法。
我会用以下方式做同样的事情:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Establish connections.
connect(ui->btn1, SIGNAL(clicked()), this, SLOT(setFileName()));
connect(ui->btn2, SIGNAL(clicked()), this, SLOT(setFileName()));
connect(ui->btn3, SIGNAL(clicked()), this, SLOT(setFileName()));
connect(ui->btn4, SIGNAL(clicked()), this, SLOT(setFileName()));
}
和
void MainWindow::setFileName()
{
QObject *btn = sender();
if (btn == ui->btn1) {
ui->edit1->setText("Text1);
} else if (btn == ui->btn2) {
ui->edit2->setText("Text2);
} else if (btn == ui->btn3)
[..]
}
相关文章:
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 一个类中的QT信号/插槽,但从不同的线程发出
- 为什么即使在使用 Qt::D irectConnection 之后,接收器的线程中仍会调用插槽?如何确保在另一个线程中调用它?
- 连接另一个在Qt中不起作用的类的插槽
- 是否可以将一个类别的插槽或常规功能从一个类连接到另一个类的插槽或常规功能?(QT)
- qnetworkAccessManager一个实例并连接插槽
- 将一个信号连接到多个插槽 Qt
- Qt移动插槽功能到另一个cpp文件
- 将一个对象的所有QT信号动态映射到一个插槽
- Qt - 解决一个插槽上的两个顺序调用,并且仅执行一次操作
- Qt:从一个对象发出相同的信号,但参数不同;插槽通过接收的参数进行区分
- Qt-有没有一种方法可以获得一个类中所有自定义插槽和信号的列表
- 如何使用信号和插槽从qt表单中获取id,然后在链表中搜索它并使用另一个表单显示结果
- Qt将GUI类中的方法连接到另一个类中的插槽
- 使用Qt信号和插槽更改另一个类的标签文本
- Qt:使用信号和插槽从另一个类调用MainWindow::Ui
- QSignalManager-无法将多个信号连接到一个插槽
- Qt按钮是呼叫2插槽,我只需要一个
- Qt信号/插槽发送一个完整的结构
- 打开一个带有插槽的新Qt窗口