2013-08-05 184 views
2

這是一個跟進問題Efficient way to make an array of labels多個按鈕點擊相同功能

我有一個由代碼(而不是設計器)所做的按鈕數組,這些按鈕都添加到網格佈局中。我想要的是能夠點擊該網格佈局上的任何按鈕,並將行和列作爲參數調用一個相同的函數。爲什麼我想這是因爲我不想寫15x15的所有功能都做同樣的事情。

有沒有辦法,或者我應該嘗試找到另一種解決方案?

詩篇。我所有的其他輸入都是通過qt設計器通過「go to slot」進行的,所以如果它必須發生,否則我將無法知道如何去做。編輯:標籤數組現在是一組按鈕。

+1

你有沒有想過使用帶自定義背景而不是標籤的按鈕? – ariwez

+0

是的我沒有意識到標籤沒有點擊功能,所以我將它們改爲按鈕。 – Tremnor

回答

2

您可以將所有的按鈕連接到不帶參數的插槽,然後獲得在這個步驟發送的位置:

  1. 鑄通過qobject_cast
  2. 發件人QObject到一個QWidget使用QLayout::indexOf(QWidget *widget)
  3. 檢索QWidget的索引然後得到與QGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan)

行,列,列間距和行間距的示例代碼應該是這樣的:

void MyWidgetWithAllLabels::commonSlot() 
{ 
    QWidget *buttonWidget = qobject_cast<QWidget*>(sender()); 
    if (!buttonWidget) 
     return; 

    int indexOfButton = ui->gridLayout->indexOf(buttonWidget); 
    int rowOfButton, columnOfButton, rowSpanOfButton, columnSpanOfButton; 

    ui->gridLayout->getItemPosition(indexOfButton, 
            &rowOfButton, &columnOfButton, &rowSpanOfButton, &columnSpanOfLabel); 
    // Now you can get a reference to that specific QPushButton 
    QLayoutItem *item = ui->gridLayout->itemAtPosition(rowOfButton, columnOfButton); 
    QPushButton *clickedButton = qobject_cast<QPushButton*>(item->widget()); 
    if (!clickedButton) 
     return; 
    // ... do something with that clickedButton 
} 

參照在相關的職位代碼,您可以將按鈕連接到插槽是這樣的:

connect(ui->tile_0_0, SIGNAL(clicked()), 
     this, SLOT(commonSlot())); 
connect(ui->tile_0_1, SIGNAL(clicked()), 
     this, SLOT(commonSlot())); 
    // ... 
+0

如何將所有標籤(按鈕現在)連接到不帶參數的插槽?我在這裏是個新手。 – Tremnor

+0

我已經編輯它使用按鈕而不是標籤,也指您的相關帖子。 – tomvodi

0

默認情況下,QLabel沒有「點擊」信號。 但是你可以用2個整數(行,列)做你自己的QLabel,當你有一個mouseReleaseEvent(或mousePressEvent)時,你發送一個自定義的信號,看起來像這樣:clicked(int row,int col)。

你也可以使用一個QSignalMapper: http://qt-project.org/doc/qt-4.8/qsignalmapper.html#details