Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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
Qt 5将带有参数的插槽分配给QPushButton 我在C++上有一个QT应用程序,我想给QPutPutt分配一个时隙。但我想传递一些参数,因为我有不止一个QPushButton做类似的事情,所以我想要一个函数,但其中有一个参数,但Qt一直告诉我,没有这样的插槽。有人能告诉我为什么以及我该怎么做吗_C++_Qt_Qt5_Qobject_Qpushbutton - Fatal编程技术网

Qt 5将带有参数的插槽分配给QPushButton 我在C++上有一个QT应用程序,我想给QPutPutt分配一个时隙。但我想传递一些参数,因为我有不止一个QPushButton做类似的事情,所以我想要一个函数,但其中有一个参数,但Qt一直告诉我,没有这样的插槽。有人能告诉我为什么以及我该怎么做吗

Qt 5将带有参数的插槽分配给QPushButton 我在C++上有一个QT应用程序,我想给QPutPutt分配一个时隙。但我想传递一些参数,因为我有不止一个QPushButton做类似的事情,所以我想要一个函数,但其中有一个参数,但Qt一直告诉我,没有这样的插槽。有人能告诉我为什么以及我该怎么做吗,c++,qt,qt5,qobject,qpushbutton,C++,Qt,Qt5,Qobject,Qpushbutton,先谢谢你 在.h文件中,我有:(一开始它是私有的,但我在搜索问题时更改了它) 然后在.cpp中: void fieldWindow::handleButton(int row, int col){ cout << row << " " << col << endl; } 这是在两个嵌套循环中完成的,因此i和j定义良好 我的错误是: QObject::connect: No such slot fieldWindow::handleButt

先谢谢你

在.h文件中,我有:(一开始它是私有的,但我在搜索问题时更改了它)

然后在.cpp中:

void fieldWindow::handleButton(int row, int col){
    cout << row << " " << col << endl;
}
这是在两个嵌套循环中完成的,因此
i
j
定义良好

我的错误是:

QObject::connect: No such slot fieldWindow::handleButton(i,j) in ..\Proj1\fieldwindow.cpp:41
QObject::connect:  (receiver name: 'fieldWindow')

我在网上读到一些东西,我应该说
handleButton(int,int)但是我应该如何传递参数呢?

遗憾的是,当调用信号时,Qt信号插槽连接不接受任何要传递到插槽的参数。这仅在信号本身提供这些参数时有效,但不能将它们添加到
connect
语句中

但是你不是唯一一个想这么做的人,所以在Qt中有一个类几乎可以做你想做的事情。此类的实例可以用作信号插槽连接的“代理”:将(多个)按钮连接到此类的插槽,并将此类的信号连接到目标插槽。然后,对于每个“发送者”实例(在您的示例中是按钮),您可以告诉类要向被调用的槽添加哪个值。例如:

QPushButton * button1 = ...;
QPushButton * button2 = ...;

QSignalMapper mapper;

connect(button1, SIGNAL(released()), &mapper, SLOT(map()));
mapper.setMapping(button1, 42); // Number to be passed in the slot

connect(button2, SIGNAL(released()), &mapper, SLOT(map()));
mapper.setMapping(button2, 1337); // Number to be passed in the slot

connect(&mapper, SIGNAL(mapped(int)), this, SLOT(handleButton(int)));
不幸的是,正如您所看到的,这个类只能处理一个参数。对于您的情况,您应该选择一种不同的方法(如果您再次遇到类似的问题,但只有一个
int
参数,我将在上面进行解释)

适合您的问题的替代方法是依赖插槽中的
sender()
。还记得你在数据结构中的映射吗

QMap<QObject*,int> rows;
QMap<QObject*,int> cols;

如果您不喜欢lambda语法,也可以使用标准库中的一些帮助程序来编写函子而不是lambda,或者您可以编写自己的函子类,但我个人认为lambda非常可读。

connect
语句不接受
信号(…)中的任何参数
表达式
SIGNAL
是一个宏,它将函数签名封装在一个字符串中,以传递给
connect
。因此它应该是
handleButton(int,int)
?!但是我该如何传递这些论点呢?!多谢各位!我可以用简单的公式
I*count\u on\u row+j
将其简化为1,因此我将尝试第一种方法,希望它能奏效!非常感谢你的详细回答:)我很高兴能帮上忙。我添加了第三种方法,如果您有Qt5,这很好。请注意,如果您只需要这些值来访问按钮数组以获取按钮指针,您也可以简单地使用
sender()
,就完成了。哦,他们添加了lambda!伟大的这工作做得很好!非常感谢!:)
QPushButton * button1 = ...;
QPushButton * button2 = ...;

QSignalMapper mapper;

connect(button1, SIGNAL(released()), &mapper, SLOT(map()));
mapper.setMapping(button1, 42); // Number to be passed in the slot

connect(button2, SIGNAL(released()), &mapper, SLOT(map()));
mapper.setMapping(button2, 1337); // Number to be passed in the slot

connect(&mapper, SIGNAL(mapped(int)), this, SLOT(handleButton(int)));
QMap<QObject*,int> rows;
QMap<QObject*,int> cols;
void fieldWindow::handleButton(){
    int row = rows[sender()];
    int col = cols[sender()];
    cout << row << " " << col << endl;
}
connect(this->buttonsField[i][j], &QPushButton::released, [=]{
    handleButton(i, j);
});