Ban*_*kin 8 c++ qt qobject qt5 qpushbutton
我在C++上有一个Qt应用程序,我想为QPushButton分配一个插槽.但我想传递一些参数,因为我有多个QPushButton做类似的事情,所以我想要一个函数,但有一个参数,但Qt一直说我没有像这样的插槽.有人能告诉我为什么以及如何做到这一点?
先感谢您
在.h文件中我有:(它在开始时是私有的,但我在搜索问题时更改了它)
public slots:
void handleButton(int row, int col);
Run Code Online (Sandbox Code Playgroud)
然后在.cpp中:
void fieldWindow::handleButton(int row, int col){
cout << row << " " << col << endl;
}
Run Code Online (Sandbox Code Playgroud)
再次在同一个.cpp中:
connect(this->buttonsField[i][j], SIGNAL(released()), this, SLOT(handleButton(i,j)));
Run Code Online (Sandbox Code Playgroud)
这是在两个嵌套的循环,这样做i和 j的明确界定.
我的错误是:
QObject::connect: No such slot fieldWindow::handleButton(i,j) in ..\Proj1\fieldwindow.cpp:41
QObject::connect: (receiver name: 'fieldWindow')
Run Code Online (Sandbox Code Playgroud)
我在互联网上读到了一些我应该说的内容handleButton(int, int);但是我应该如何传递这些论点呢?
lee*_*mes 11
遗憾的是,当调用信号时,Qt信号槽连接不接受任何传递给槽的参数.这仅在信号本身提供这些参数时有效,但您无法在connect语句中添加它们.
但是你并不是唯一一个想要这样做的人,所以在Qt中有一个几乎可以做你想做的课:QSignalMapper.此类的实例可用作信号槽连接的"代理":将(多个)按钮连接到此类的插槽,并将此类的信号连接到目标插槽.然后,对于每个"发送者"实例(在您的情况下按钮),您可以告诉该类要添加到被调用插槽的值.例:
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)));
Run Code Online (Sandbox Code Playgroud)
可悲的是,正如您所看到的,这个类只能处理一个参数.对于你的情况,你应该选择一个不同的方法(我解释了上面的情况,以防你再次遇到类似的问题,但只有一个int参数).
适合您的问题的替代方案是依赖sender()于插槽.记住你在数据结构中的映射
QMap<QObject*,int> rows;
QMap<QObject*,int> cols;
Run Code Online (Sandbox Code Playgroud)
并访问您的插槽中没有参数的那些:
void fieldWindow::handleButton(){
int row = rows[sender()];
int col = cols[sender()];
cout << row << " " << col << endl;
}
Run Code Online (Sandbox Code Playgroud)
当然,在初始化UI时,您需要在这些地图中添加适当的值.或者您可以在现有阵列中搜索按钮buttonsField.
自Qt5和C++ 11以来存在另一种方法:您可以使用lambda函数处理信号,而不是槽.这看起来像这样(信号使用新语法命名):
connect(this->buttonsField[i][j], &QPushButton::released, [=]{
handleButton(i, j);
});
Run Code Online (Sandbox Code Playgroud)
如果你不喜欢lambda语法,也可以使用标准库中的一些帮助器来组成一个functor而不是lambda,或者你可以编写自己的functor类,但我个人觉得lambda非常易读.