2013-05-10 60 views
1

所以我动态创建QPushButton对象,然后将它们映射为发射信号。 从与信号相关的插槽中,我想编辑对象的属性(在本例中为文本,即QPushButton :: text())。Qt信号映射:编辑发射器对象

在头文件中的类“对话框中的”我有:

private: 
QSignalMapper *signalMapper; 

private slots: 
    void buttonGeneric(QPushButton &button); 

signals: 
    void clicked(QPushButton &button); 

在“对话框中的”类在.cpp文件中构造我:

signalMapper = new QSignalMapper(this); 

for (int i = 0; i < 100; ++i) 
{ 
    QPushButton *button = new QPushButton(QString::number(i + 1)); 
    connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
    signalMapper->setMapping(button, button); 
    ui->gridLayout->addWidget(button, 2 + (i/10), (i % 10)); 
} 
connect(signalMapper, SIGNAL(mapped(QPushButton &button)), this, SIGNAL(clicked(QPushButton &button))); 
connect(this, SIGNAL(clicked(QPushButton &button)), this, SLOT(buttonGeneric(QPushButton &button))); 

最后外我有同样的.cpp文件中的构造函数:

void dialog::buttonGeneric(QPushButton & button) 
{ 
    button.setText("hello"); 
} 

此代码编译并运行,但当我单击按钮没有g发生。在应用程序调试输出我得到如下:

QObject::connect: No such signal QSignalMapper::mapped(QPushButton &button) 
QObject::connect: (receiver name: 'dialog') 
QObject::connect: No such signal dialog::clicked(QPushButton &button) 
QObject::connect: (sender name: 'dialog') 
QObject::connect: (receiver name: 'dialog') 

如此反复,我想点击的按钮上的文字变成新的东西。 我该怎么做?

预先感谢您。

回答

0

QSignalMapper没有信号mapped(QPushButton&)。它确实有mapped(QWidget*),但是,这是你的按钮发射的那个。所以你应该连接到这个信号(并相应地修改你的对话信号&插槽)。

+0

但是,如果我将QWidget作为参数传递给你,那么我将如何访问QPushButton的文本属性? QWidget没有“setText()”方法。 – Aske 2013-05-10 17:02:57

+0

@ user1545986您可以使用'qobject_cast',或者如果您确定对象将始终是您期望的类型'static_cast'。 – Angew 2013-05-10 17:16:04

+0

谢谢你的精彩帮助!这解决了它! – Aske 2013-05-10 17:21:05