2012-10-05 25 views
2

我從C++和Qt開始。我有一個QPushButtons矩陣,我想處理它們的點擊事件。問題是我不能告訴插槽陣列中的按鈕的座標,以便我可以與他們一起玩。我成功地將一個整數傳遞給我的插槽,但不是兩個座標。我不知道如果我讓自己很清楚......這是我的問題的代碼:如何將矩陣中按鈕的座標傳遞給點擊插槽?

for (int i = 0; i < mapSize_x; i++) { 
    for (int j = 0; j < mapSize_y; j++) { 
     buttonsArray[i][j] = new QPushButton(); 
     ui->mainLayout->addWidget(buttonsArray[i][j], i, j); 

     connect(buttonsArray[i][j], SIGNAL(clicked()), 
       signalMapper, SLOT(map())); 
     signalMapper->setMapping(buttonsArray[i][j], i, j); // here 
    } 
} 
connect(signalMapper, SIGNAL(mapped(int, int)), 
     this, SLOT(buttonClick(int, int))); 

只有setMapping接受兩個參數,我想傳遞三個。有沒有解決方法?我GOOGLE了很多,仍然無法找到答案。我也嘗試傳遞QPushButton對象而不是座標,但也失敗了。提前致謝。

+0

你只需要一個指向你的插槽中的QPushButton的指針? – Chris

+0

一個指向QPushButton的指針或座標... –

回答

2

考慮使用QHash來存儲您的按鈕,由按鈕本身鍵入並指向包含它們的行和列的對。然後,您應該能夠根據小部件指針設置映射,然後在信號映射器發出其信號時查找關聯的行和列。例如,如下聲明一個類數據成員:

QHash<QPushButton*, QPair<int, int> > buttonHash; 

然後上述代碼可能成爲

for (int i = 0; i < mapSize_x; i++) { 
    for (int j = 0; j < mapSize_y; j++) { 
     QPair<int, int> gridPair(i, j); 
     QPushButton* button = new QPushButton(); 
     buttonHash.insert(button, gridPair); 
     ui->mainLayout->addWidget(button, i, j); 

     connect(button, SIGNAL(clicked()), 
       signalMapper, SLOT(map())); 
     signalMapper->setMapping(button, qobject_cast<QWidget*>(button)); 
    } 
} 
connect(signalMapper, SIGNAL(mapped(QWidget*)), 
     this, SLOT(buttonClick(QWidget*))); 

最後,您的buttonClick槽會成爲以下:

void SomeClass::buttonClick(QWidget* widget) { 
    QPair<int, int> pair = buttonHash.value(qobject_cast<QPushButton*>(widget)); 
    int myRow = pair.first; 
    int myColumn = pair.second; 

    ... 
} 

有還有至少2種解決此問題的其他方法:

  1. 您可以嘗試將行和列組合成一個字符串並使用QSignalMapper::setMapping(QObject*, const QString&)。這將需要一些邏輯將行和列從buttonClick插槽中的字符串中拉出。
  2. 您可以嘗試通過使用位移和位按比例將行和列合併爲一個整數。那麼你可以依靠QSignalMapper::setMapping(QObject*, int)。這需要一些邏輯將行和列從buttonClick插槽中的整數中拉出。

我不會詳細討論這些其他解決方案,因爲它們有點難看。我上面提供的解決方案仍然是最直觀的。

+0

太棒了,這是我想要的,完全可以,謝謝!我其實已經想到了你給的選擇,但他們確實很醜。 –

0

在某些情況下,QSignalMapper類可能非常有用,但對於您當前的使用情況而言,它可能是過度的。

取而代之,可以考慮使用QButtonGroup,它專門設計用於您正在嘗試執行的操作,並提供更簡潔,更簡單的API。

+0

這是一堂我從未聽說過的好課,但我不明白它是如何幫助我解決座標問題的。不管怎麼說,還是要謝謝你! –

+0

@pvjlieuthier。它有幫助,因爲它消除了傳遞座標的需要。相反,您可以使用按鈕組的'buttonClicked'信號,該信號發送對被點擊的按鈕的引用。 – ekhumoro

相關問題