QT在这种情况下如何发出信号

时间:2017-03-31 15:03:45

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

我需要开发一个数独游戏。在读取包含数字值的文本文件后,我创建了9 * 9个小部件。 如果(该值已经设置,那么我实例化为包含该数字的Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable. , 否则我实例化一个包含每种情况的可能值的组合框。)

直到这里一切都好。 问题是,当从组合框中选择一个值时,我需要在我的视图(MVC)中以正方形绘制它。问题是我怎么知道选择了哪一个?

我可以从组合框信号中使用的唯一信号是qlabel,但我不知道哪个组合产生了该信号。 对我来说理想的是这样currenttextchanged(QString),但我不知道我是否可以定义一个新信号?

以下是一些代码:

SIGNAL(curretextchanged(QString, int, int))

3 个答案:

答案 0 :(得分: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参数。

答案 1 :(得分:0)

您可以向插槽询问发件人()

  

QObject * QObject :: sender()const

     

如果在a中调用,则返回指向发送信号的对象的指针   由信号激活的插槽;否则它返回0.指针是   仅在执行调用此插槽的插槽期间有效   函数来自此对象的线程上下文。

答案 2 :(得分:0)

您可以使用 QSignalMapper 。 在此,您使用mapper将每个项目映射到任何特定字符串。现在,当任何映射项目发出信号时,您可以知道字符串发出的项目。

如上所述,您可以使用相同的微小更改,例如使用信号' 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类收集一组无参数信号,和   使用相应的整数,字符串或窗口小部件参数重新发出它们   到发送信号的对象