使用QSignalMapper将QString传递给父级的类方法
Passing a QString to a class method of parent with QSignalMapper
我有一个父类及其方法来更改某些Signals上的标签图片。例如,当QComboBox中发生某些事情时。。。(值已更改,已激活)
class parentClass : public QMainWindow
{
Q_OBJECT
...
public slots:
//this is the slot i want to connect to some signal of
//e.g a combo box to change the picture by passed in string
void changePicture(QString fileName);
然后我有了这个孩子:
class childClass : public QObject
{
Q_OBJECT
public:
childClass(parentClass *parent, QTabWidget *tab, QStringList *guards=0);
private:
bool readCombo(QXmlStreamReader *xmlreader);
现在在readCombo
内部,我想读取一个字符串并将其传递给更改图片:
QString imageFileName = xmlreader->attributes().value("image").toString();
QSignalMapper * signalMapper = new QSignalMapper(parent);
//this is just one of many trials to get this working, i hope you get the picture
connect(combo , SIGNAL(activated(int)), parent, SLOT(changePicture(QString *)));
signalMapper->setMapping(combo, imageFileName);
但这给了我No such Signal
、No such Slot
或大写的Incompatiple sender/receiver arguments
我希望能在这方面得到一些帮助,因为语法真的不直观(imo),而且我找不到任何适合我的案例的好参考(在询问之前做了很多尝试和错误)
代码中的一些问题。
- 你真的无法连接到
QObject
的专用插槽 - 每次调用
readCombo
时,都要创建一个新的信号映射器,但没有清除该映射器,从而导致memleaks - 多次调用
connect
会创建多个连接,即您将使用单个信号多次调用同一个插槽
从您的示例代码中,我看到您可以通过将parentClass
插槽设为公共插槽或向childClass
添加一个信号并在parentClass
中连接到它来解决此问题。
另一个选项是这样更改readCombo
:
QString imageFileName = xmlreader->attributes().value("image").toString();
parentClass->changePicture(imageFileName);
和你的家长班级作为
class parentClass : public QMainWindow
{
Q_OBJECT
...
public slots:
//this is the slot i want to connect to some signal of
//e.g a combo box to change the picture by passed in string
void changePicture(QString fileName);
我看到几个错误:
- 您正在从
childClass
连接到parentClass
中的专用插槽,如果要连接,则应将其设为公用插槽 - 将信号连接到具有另一个函数签名的插槽。您的信号具有参数类型
int
和插槽类型QString*
。函数应该共享相同类型的参数 - 在您的连接中,请在插槽中使用参数类型
QString*
,但在parentClass
中,参数类型为QString
有关信号和插槽的更多信息,请参阅:signals&插槽。
附言:您对childClass
和parentClass
的命名也不清楚,因为它们都继承了QObject
。请参见C++继承。
好的,得到了:
QString imageFileName = xmlreader->attributes().value("image").toString();
QSignalMapper * signalMapper = new QSignalMapper(parent);
signalMapper->setMapping(combo, imageFileName);
connect(signalMapper, SIGNAL(mapped(QString)), parent, SLOT(changePicture(QString)));
connect( combo, SIGNAL(activated(int)), signalMapper, SLOT(map()) );
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在静态库中嵌入类方法
- 如何制作一个将函数作为参数的类方法
- 从父类方法返回子类对象
- 使用用户定义的参数调用future/async并调用类方法
- 重载类方法的不明确调用
- 单独定义模板化嵌套类方法的正确语法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何访问由共享指针保存的类方法?
- 将子类方法声明为基类的友元
- 我的模板类方法返回错误类型?
- Qt将信号与另一个类方法连接
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 检查类方法中是否(此 == nullptr)
- 从基类实例调用派生类方法而不进行强制转换
- 函数从唯一代码调用正确的子类方法
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- C++:从属性类调用顶级类方法