2013-05-10 59 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