QT在这种情况下如何发出信号
Posted
技术标签:
【中文标题】QT在这种情况下如何发出信号【英文标题】:QT how to emit a signal in this case 【发布时间】:2017-03-31 15:03:45 【问题描述】:我需要开发一个数独游戏。读取包含数值的文本文件后,我创建了 9*9 小部件。
如果(该值已设置,那么我将实例化为包含该数字的qlabel
,
否则我会实例化一个包含每种情况的可能值的组合框)。
直到这里一切正常。 问题是,当从组合框中选择一个值时,我需要在我的视图 (MVC) 中将它绘制在一个正方形中。问题是我怎么知道选择了哪一个?
我可以从组合框信号中使用的唯一信号是currenttextchanged(QString)
,但我不知道是哪个组合发出了该信号。
对我来说最理想的应该是这样的SIGNAL(curretextchanged(QString, int, int))
,但我不知道我是否可以定义一个新信号?
这是一些代码:
QWidget *tab[9][9];
SudModel *modele = ???;
QComboBox *combobox = new QComboBox();
combobox->setStyleSheet("border: 1px solid red");
int tmp = modele->valuesof(i, j).size();
for (int s = 0; s < tmp; s++)
combobox->addItem(QString::number(modele->valuesof(i, j)[s]));
connect(combobox, SIGNAL(currentTextChanged(QString)), this, SLOT(update()));
tab[i][j] = combobox;
【问题讨论】:
【参考方案1】:一种解决方案是在您连接到特定组合框的信号时附加该额外信息。
例如,假设您有函数update(QString text, int x, int y)
,那么您可以将信号附加到一个 lambda,该 lambda 使用在连接时捕获的额外参数调用该函数。像这样的:
connect(combobox, &QComboBox::currentTextChanged, [x, y, this](const QString& text) this->update(text, x, y); );
然后,这将调用更新函数,并使用在建立连接时捕获的 x
和 y
值以及源自信号的 text
参数。
【讨论】:
【参考方案2】:你可以向 slot 请求一个 sender()
QObject *QObject::sender() 常量
如果在 a 中调用,则返回指向发送信号的对象的指针 由信号激活的时隙;否则返回 0。指针为 仅在调用它的插槽执行期间有效 此对象的线程上下文中的函数。
【讨论】:
【参考方案3】:您可以使用 QSignalMapper。 在这种情况下,您可以使用带有任何特定字符串的映射器映射每个项目。现在,当任何映射项发出信号时,您可以知道字符串发出的是哪个项。
您可以使用相同的小改动,例如使用前面提到的 Signal 'currentTextChanged'。但是使用 'currentIndexChanged' 信号并进行一些修改可以获得相同的结果。
signalMapper = new QSignalMapper(this);
for (int i = 0; i < 2; ++i)
QComboBox *combo = new QComboBox();
connect(combo, SIGNAL(currentIndexChanged()), signalMapper, SLOT(map()));
signalMapper->setMapping(combo, "combo" + i);
connect(signalMapper, SIGNAL(mapped(QString)),
this, SIGNAL(indexChanged(QString)));
注意:(源 Qt 助手)
QSignalMapper 类收集一组无参数信号,并且 用对应的整数、字符串或小部件参数重新发出它们 到发送信号的对象
【讨论】:
以上是关于QT在这种情况下如何发出信号的主要内容,如果未能解决你的问题,请参考以下文章
Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?