在QListWidgetItem中使用setItemWidget添加QPushButton的问题

时间:2010-10-23 15:27:48

标签: qt

我想在ListItm中添加一个QPushButton,所以我已经实现了下面给出的代码。但是按钮位于列表的中间,实际上我希望它位于列表项的下端。这怎么可能。此按钮单击事件也不起作用。实际上我想直接禁用项目点击事件,通过单击QListWidgetItem内的按钮,我想启用项目点击事件。但我无法执行此操作。这该怎么做?我使用了以下代码片段:

list=new QListWidget(this);
// list->setStyleSheet("* { background-color:rgb(0,0,0); padding: 10px ; color:rgb(255,255,255)}");
list->setGeometry(0,61,360,475);
list->setSortingEnabled(true);
//connect(list,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(ItemClicked(QListWidgetItem*)));

item=new QListWidgetItem();
item->setIcon(QIcon(":/images/Icon.png"));
item->setText("Item1");
item->setSizeHint(QSize(80,80));
item->setBackgroundColor(QColor(200,255,100));

list->addItem(item);
QPushButton *but = new QPushButton(">");
but->setMaximumSize(50,80);
but->setFlat(true);
// but->setGeometry(QRect(500,100,100,100));
but->setStyleSheet("background: transparent; border: none");
QHBoxLayout *layout= new QHBoxLayout();
layout->addWidget(but);
QWidget *widget = new QWidget();
widget->setLayout(layout);
item->setSizeHint(widget->sizeHint());
list->setItemWidget(item, widget);
connect(but, SIGNAL(clicked()), this, SLOT(ItemClicked()));
#if defined(Q_WS_S60)
list->showMaximized();
#else
list->show();
#endif

ItemClicked()
{
int Index = list->currentIndex().row();//Always getting this Index as -1
}

请查看以上代码并提供您的建议。 谢谢......

1 个答案:

答案 0 :(得分:2)

重新考虑使用QPushButton作为listwidget的“click”句柄。 QListWidgetItem不是QObject是有原因的。 QObjects有点“沉重”,因为它们拥有所有元数据结构。这就是为什么Qt没有在像QListWidgetItem这样的面向数据的列表中使用QObjects。

关于您的问题。你将永远得到-1,直到你不会选择项目,不是点击它的按钮部分,而是点击项目。那是因为QPushButton正在关注焦点,并且没有将click事件传递给QListWidgetItem。所以它甚至可能发生,您选择idx = 3的项目,点击idx = 1的项目按钮,并进入您的插槽idx 3。

Actualy,就我而言,你的整体表现完全是错误的。首先,我会使用QTreeWidget,用于多列。其次,我将“实现”自定义项委托,绘制“按钮”,然后我将其设置为第1列的委托。然后我会正常捕获“单击事件”,但仅对第1列作出反应。

| column 0 (actual data exposition) | column 1 (custom delegate, draw button)