【问题标题】:QT how to emit a signal in this caseQT在这种情况下如何发出信号
【发布时间】: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;

【问题讨论】:

    标签: c++ qt combobox qobject qt-signals


    【解决方案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 类收集一组无参数信号,并且 用对应的整数、字符串或小部件参数重新发出它们 到发送信号的对象

        【讨论】:

          猜你喜欢
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多