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

然后,这将调用更新函数,并使用在建立连接时捕获的 xy 值以及源自信号的 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 中 QThread 类的特定对象发出信号?

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

Q_PROPERTY 发出的信号如何被捕获?

如何监测 QT 信号?

Qt:更改QPointer时发出信号

如果在调用 QObject::connect() 之前发出信号,如何避免竞争?