在QT中的QT点击问题中将自定义窗口小部件添加到QListWidget?

时间:2011-11-09 10:47:53

标签: 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 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 Custom Widget项添加到QListWidget。 现在的问题是我在CustomWidget中使用One QPushButton现在当我点击ListWidget中的ListWidgetItem按钮我想将按下状态更改为某个背景图像并且在发布时它应该恢复到正常状态。为此我使用样式表来这样做但是当我点击按钮时,它没有得到List Widget的单击事件(itemclicked SLOT of List)双击它。

如何单击?

1 个答案:

答案 0 :(得分:3)

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

按下按钮时,会发出pressed信号。释放时,会发出released信号。我会告诉你如何为其中一个做这件事,你应该为另一个做同样的事。

最直接的做法是在按钮的pressed信号和将修改列表背景的插槽之间添加连接。你拥有的是QListWidget,其中有一些UserDetails个小部件,每个小部件都有一个QPushButton。因此,我们必须从QPushButton一直到QListWidget

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

connect(ui->button, SIGNAL(pressed()), this, SIGNAL(buttonPressed())

现在我们要通知QListWidget已按下按钮。为了实现这一目标,我们必须将来自buttonPressed的{​​{1}}信号与插槽相连,让我们调用插槽UserDetails

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()中有一个函数(getButton())返回UserDetails,您只能有一个连接< / p>

ui->button

编辑2

如果您只想在按下按钮后更改按钮的背景,则可以使用stylesheets来实现。您需要在样式表中输入一个用于正常按钮状态的条目和一个用于connect(myItem->button(), SIGNAL(pressed()), this, SLOT(buttonPressedSlot())); 状态的条目。有关可用状态的列表,请查看here。示例代码如下

pressed

请注意,我使用QListView Descendant Selector才能只获取 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; }

的子项QPushButtons