使用 QSignalMapper 将 QString 传递给 parent 的 class 方法
Passing a QString to a class method of parent with QSignalMapper
我有一个 parent class 及其方法来更改某些信号上的标签图片。例如。当 QComboBox 中发生某些事情时... (valueChanged, activated)
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);
然后我有这个 child:
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
时都在创建一个新的信号映射器,您没有清除它 - 导致内存泄漏。
- 多次调用
connect
会创建多个连接,即您将使用单个信号多次调用同一个插槽。
从您的示例代码中,我看到您可以通过制作 parentClass
插槽 public 或向 childClass
添加一个信号并在 parentClass
.
其他选项是像这样更改 readCombo
:
QString imageFileName = xmlreader->attributes().value("image").toString();
parentClass->changePicture(imageFileName);
和你的 parent class 作为
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
中的专用插槽,如果要连接它,您应该将其设置为 public。
- 您将信号连接到具有另一个函数签名的插槽。您的信号具有参数类型
int
和插槽类型 QString*
。这些函数应该共享相同类型的参数。
- 在您的连接中,您指的是在您的插槽中使用参数类型
QString*
,但在 parentClass
中,参数类型是 QString
。
有关信号和槽的更多信息,请参阅:Signals & Slots。
PS:你对childClass
和parentClass
的命名也不明确,因为它们都继承自QObject
。参见 C++ inheritance。
好的,知道了:
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()) );
我有一个 parent class 及其方法来更改某些信号上的标签图片。例如。当 QComboBox 中发生某些事情时... (valueChanged, activated)
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);
然后我有这个 child:
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
时都在创建一个新的信号映射器,您没有清除它 - 导致内存泄漏。 - 多次调用
connect
会创建多个连接,即您将使用单个信号多次调用同一个插槽。
从您的示例代码中,我看到您可以通过制作 parentClass
插槽 public 或向 childClass
添加一个信号并在 parentClass
.
其他选项是像这样更改 readCombo
:
QString imageFileName = xmlreader->attributes().value("image").toString();
parentClass->changePicture(imageFileName);
和你的 parent class 作为
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
中的专用插槽,如果要连接它,您应该将其设置为 public。 - 您将信号连接到具有另一个函数签名的插槽。您的信号具有参数类型
int
和插槽类型QString*
。这些函数应该共享相同类型的参数。 - 在您的连接中,您指的是在您的插槽中使用参数类型
QString*
,但在parentClass
中,参数类型是QString
。
有关信号和槽的更多信息,请参阅:Signals & Slots。
PS:你对childClass
和parentClass
的命名也不明确,因为它们都继承自QObject
。参见 C++ inheritance。
好的,知道了:
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()) );