将自定义小部件添加到QT中的QListWidget单击QT中的问题?

将自定义小部件添加到QT中的QListWidget单击QT中的问题?,qt,Qt,我正在向QListWidget添加自定义小部件。 我的自定义小部件包含2个标签,1个按钮 /*我的自定义小部件 UserDetails *myItem = new UserDetails(0," ALOA, Jeon"); UserDetails *myItem1 = new UserDetails(0," LOUIS, Stacy"); QListWidgetItem *item = new QListWidgetItem(); QListWidgetItem *item1 = new Q

我正在向QListWidget添加自定义小部件。 我的自定义小部件包含2个标签,1个按钮
/*我的自定义小部件

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);
使用上述代码,我将mu自定义小部件项添加到QListWidget。 现在的问题是,我在我的CustomWidget中使用了一个QPushButton,当我在ListWidget中单击ListWidgetItem时,我想将按下的状态更改为一些背景图像,在释放时,它应该会返回到正常状态。为此,我使用样式表来执行此操作,但当我单击按钮时,它不会得到列表小部件的click事件(列表的itemclicked插槽)双击它即可获得


如何进行单次单击?

这并不是那么简单,但它是可行的。问题是,当您单击按钮时,按下事件不会传播到列表小部件。因此,您必须找到一种方法将信号传播回列表小部件

按下按钮时,会发出
按下的
信号。释放按钮时,会发出
释放的
信号。我将向您演示如何对其中一个按钮执行此操作,您应该对另一个按钮执行此操作

做你想做的事情最直接的方法是在按钮的
按下
信号和修改列表背景的插槽之间添加一个连接。你有一个
QListWidget
,其中有一些
UserDetails
小部件,每个小部件都有一个
QPushButton
o从
QPushButton
一直到
QListWidget

在您的
UserDetails
类中创建一个新信号,例如
buttonPressed()
并将按钮的
pressed()
信号与其连接。这样,每次在小部件中单击按钮时,小部件本身都会通知世界其按钮已被单击

connect(ui->button, SIGNAL(pressed()), this, SIGNAL(buttonPressed())
现在我们要通知
QListWidget
按钮已按下。为了实现这一点,我们必须将
UserDetails
中的
buttonPressedSlot
信号与插槽连接起来,让我们调用插槽
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
  }
}
编辑2

如果您只想在按下按钮时更改按钮的背景,则可以使用来实现。您需要在样式表中输入一个用于正常按钮状态,另一个用于
按下状态。有关可用状态的列表,请查看。下面是示例代码

    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是为了只获取这些
QPushButtons
,它们是
QListView

的子项。以前我在QTreeWidget中做过类似的事情,但我不必对itemClicked()做任何事情。我只需将按钮连接到任何位置,QTreeWidget会将单击事件向下传播到按钮本身。您应该使用模型视图delegate此处的myitem是什么?connect(myitem,SIGNAL(pressed()),this,SLOT(buttonPressedSlot()).My ListWidget位于不同的页面,而自定义控件位于不同的页面。@WebLetic:我想更改按钮的背景图像,而不是项目,按钮在按下状态下应有不同的bgimage,而在释放状态下应有不同的bgimage,因为项目没有setstylesheet属性来更改bg图像。实际上,上述所有代码都可以正常工作。问题我发现我正在应用一个kineticscroller(触摸屏设备的手指滚动)这就产生了这个问题,效果是在双击时应用的,而不是在按钮的单击按下状态下应用的。我指的是kinetic scoller实现,并将其应用于我的ListWidget。你知道如何克服这个问题吗?
connect(myItem->button(), SIGNAL(pressed()), this, SLOT(buttonPressedSlot()));
    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;
     }