我有一个父类,其方法是更改某些信号上的标签图片。例如。当QComboBox中发生某些事情时......(valueChanged,激活)
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),我找不到任何适用于我的案例的好参考(在询问之前做了很多试验和错误)< / p>
答案 0 :(得分:2)
您的代码存在一些问题。
QObject
readCombo
时,您都会创建一个新的信号映射器,而这些信号映射器不会被清除 - 这会导致memleaks。connect
会创建多个连接,即您将使用单个信号多次调用同一个插槽。从您的示例代码中,我看到您可以通过将parentClass
广告位公开或向childClass
添加信号并在parentClass
中与其连接来解决此问题。< / p>
其他选项是更改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);
答案 1 :(得分:1)
我看到几个错误:
parentClass
childClass
连接到私人广告位,如果要连接,则应将其公开。int
,插槽类型为QString*
。这些函数应该共享相同类型的参数。QString*
,但在parentClass
中,参数类型为QString
。有关信号和广告位的详细信息,请参阅:Signals & Slots。
PS:childClass
和parentClass
的命名不明确,因为它们都是从QObject
继承的。请参阅C++ inheritance。
答案 2 :(得分:0)
好的,明白了:
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()) );