這並不那麼簡單,但它是可行的。問題是,當你點擊按鈕時,新聞事件不會傳播到列表小部件。所以你必須找到一種方法將信號傳播回列表小部件。
當按鈕被按下時,發出pressed
信號。當它被釋放時,發出released
信號。我會告訴你如何爲其中一個人做到這一點,你應該爲另一個人做同樣的事情。
要做你想做的事情的最直接的方法是在按鈕的信號和插槽之間添加一個連接,以修改列表的背景。你有什麼是QListWidget
其中有一些UserDetails
部件每個都有QPushButton
。所以我們必須從QPushButton
一直到QListWidget
。
在你的UserDetails
類中創建一個新的信號,例如buttonPressed()
並將它的pressed()
信號連接到它。這種方式每次按下按鈕時,小部件本身都會通知世界其按鈕已被點擊。
connect(ui->button, SIGNAL(pressed()), this, SIGNAL(buttonPressed())
現在我們要通知QListWidget
該按鈕已被按下。爲了實現這一點,我們必須連接從UserDetails
有槽buttonPressed
信號,我們稱之爲插槽buttonPressedSlot()
connect(myItem, SIGNAL(pressed()), this, SLOT(buttonPressedSlot())
現在槽應檢測其是發送者(因爲所有UserDetails
物體會連接到同一插槽,找到相應的QListWidgetItem
並調用會更新這個項目的背景插槽。
void LiwstWidgetClick::buttonPressedSlot()
{
QObject* signalSender = QObject::sender();
UserDetails* p = qobject_cast<UserDetails *>(signalSender);
if (p == NULL)
return;
// Get Position in list widget
for (unsigned i=0; i<ui->listWidget->count(); i++)
{
QListWidgetItem* item = ui->listWidget->item(i);
if (ui->listWidget->itemWidget(item) == p)
cellClicked(item); // THIS IS YOUR FUNCTION THAT CHANGES THE
// BACKGROUND OF THE GIVEN ITEM
}
}
你應該爲released()
信號做同樣的。
編輯
如果按鈕是公開,你可以避開額外的信號,例如,如果你有你的UserDetails
功能(getButton()
)返回的ui->button
你可能只是一個連接
connect(myItem->button(), SIGNAL(pressed()), this, SLOT(buttonPressedSlot()));
編輯2
如果你只是想改變背景y ou按鈕時,您可以使用stylesheets來實現它。您需要在樣式表中輸入一個用於正常按鈕狀態,另一個用於pressed
狀態。有關可用狀態的列表,請看here。示例代碼如下
QListView QPushButton {
color: grey;
border-image: url(/path/to/image1) 3 10 3 10;
}
QListView QPushButton:pressed {
color: red;
border-image: url(/path/to/image2) 3 10 3 10;
}
請注意,我用的而QListView Descendant Selector爲了得到只有這些QPushButtons
是的QListView
孩子當我以前做過QTreeWidget了類似的事情,我還沒有過用itemClicked()做任何事情。我只需將按鈕連接到任何地方,QTreeWidget將click事件傳播到按鈕本身。 – cmannett85
您應該使用Model-View-Delegate – fasked