Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT在这种情况下如何发出信号_C++_Qt_Combobox_Qobject_Qt Signals - Fatal编程技术网

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

C++ QT在这种情况下如何发出信号,c++,qt,combobox,qobject,qt-signals,C++,Qt,Combobox,Qobject,Qt Signals,我需要开发一个数独游戏。读取包含数值的文本文件后,我创建了9*9小部件。 如果(该值已设置,则我实例化为包含该数字的qlabel, 否则我将实例化一个组合框,其中包含每个案例的可能值) 直到这里一切都好。 问题是,当从组合框中选择一个值时,我需要在视图(MVC)中以正方形绘制它。问题是我如何知道选择了哪一个 我可以从组合框信号中使用的唯一信号是currenttextchanged(QString),但我不知道是哪个组合发出了该信号。 对我来说最理想的是这样的信号(curretextchanged

我需要开发一个数独游戏。读取包含数值的文本文件后,我创建了9*9小部件。 如果(该值已设置,则我实例化为包含该数字的
qlabel
, 否则我将实例化一个组合框,其中包含每个案例的可能值)

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

我可以从组合框信号中使用的唯一信号是
currenttextchanged(QString)
,但我不知道是哪个组合发出了该信号。 对我来说最理想的是这样的
信号(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;
QWidget*tab[9][9];
SudModel*modele=???;
QCOMBOX*组合框=新的QCOMBOX();
组合框->设置样式表(“边框:1px实心红色”);
int tmp=modele->valuesof(i,j).size();
对于(int s=0;s添加项(QString::number(modele->valuesof(i,j)[s]);
}
连接(组合框,信号(currentTextChanged(QString)),此,插槽(update());
tab[i][j]=组合框;

一种解决方案是在连接到特定组合框的信号时附加额外信息

例如,假设您的函数
更新(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
参数。

您可以向插槽请求发送器()

QObject*QObject::sender()常量

如果在中调用,则返回指向发送信号的对象的指针 由信号激活的插槽;否则返回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)));
signalMapper=新的QSignalMapper(此);
对于(int i=0;i<2;++i){
QCOMBOX*组合=新的QCOMBOX();
连接(组合、信号(currentIndexChanged())、信号映射器、插槽(map());
信号映射器->设置映射(组合,“组合”+i);
}
连接(信号映射器、信号(映射(QString)),
这个,信号(indexChanged(QString));
注:(来源Qt助理)

QSignalMapper类收集一组无参数信号,并 使用相应的整数、字符串或小部件参数重新发出它们 发送信号的对象