2011-11-09 76 views
1

我將自定義小部件添加到QListWidget。 我的自定義窗口小部件包含2個標籤,1個按鈕
/*我的自定義部件在QT中添加自定義小部件到QListWidget點擊QT中的問題?

UserDetails *myItem = new UserDetails(0," ALOA, Jeon"); 
UserDetails *myItem1 = new UserDetails(0," LOUIS, Stacy"); 
QListWidgetItem *item = new QListWidgetItem(); 
QListWidgetItem *item1 = new QListWidgetItem(); 
item->setSizeHint(QSize(0,45)); 
item1->setSizeHint(QSize(0,45)); 
ui->listWidget->addItem(item); 
ui->listWidget->addItem(item1); 
ui->listWidget->setItemWidget(item,myItem); 
ui->listWidget->setItemWidget(item1,myItem1); 

使用上面的代碼我加入畝自定義部件項目QListWidget。 現在的問題是我在我的CustomWidget中使用一個QPushButton,現在當我點擊ListWidget中的ListWidgetItem時,我想將按鈕狀態更改爲某種背景圖像,並在發佈時應該回到正常狀態。爲此,我使用樣式表這樣做,但是當我點擊按鈕它沒有得到List Widget的單擊事件(itemclicked SLOT的列表)雙擊它獲取。

如何獲得單擊?

+0

孩子當我以前做過QTreeWidget了類似的事情,我還沒有過用itemClicked()做任何事情。我只需將按鈕連接到任何地方,QTreeWidget將click事件傳播到按鈕本身。 – cmannett85

+1

您應該使用Model-View-Delegate – fasked

回答

3

這並不那麼簡單,但它是可行的。問題是,當你點擊按鈕時,新聞事件不會傳播到列表小部件。所以你必須找到一種方法將信號傳播回列表小部件。

當按鈕被按下時,發出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

+0

這裏的myitem是什麼?連接(myItem,SIGNAL(按下()),這個,SLOT(buttonPressedSlot())。我的ListWidget是在不同的頁面和自定義控件是不同的頁面 – user662285

+0

@webcletic:我想改變按鈕的背景圖像,而不是項目,按鈕應該有不同的bgimage按下狀態和不同的釋放狀態,因爲項目沒有setstylesheet屬性來更改bg圖像 – user662285

+0

檢查我更新的答案 – pnezis