QListWidget的item使用自定义界面,如何对自定义界面进行处理
- 自定义界面
class ItemWidget : public QWidget
{
Q_OBJECT
public:
explicit ItemWidget(QWidget *parent = 0);
void setWidgetInfo(QString, QString); // 界面信息
/*
setActiveWidget()函数内容:
true: 显示ABC三个按钮btn,并隐藏0号label
false:与true相反
*/
void setActiveWidget(bool); // 界面是否被选中
private slots:
void doAbtn();
private:
QString m_str;
// 默认显示
QLabel *m_1label;
QLabel *m_2label;
QLabel *m_0label;
// 默认隐藏
QPushButton *m_Abtn; // connect doAbtn()槽函数
QPushButton *m_Bbtn;
QPushButton *m_Cbtn;
};
- 主界面关键函数
QListWidget *m_itemList; // QListWidget
/* 省略 */
// list处理
void MainWindow::showList()
{
/* 省略,以下举例 */
listAdditem("/home/tdlzg/aaa", "xxxxx");
listAdditem("/home/tdlzg/bbb", "xxxxx");
listAdditem("/home/tdlzg/ccc", "xxxxx");
// 当list选中item改变后...
connect(m_itemList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(setListItemState(QListWidgetItem*, QListWidgetItem*)));
}
// list中添加item
void MainWindow::listAdditem(QString str, QString label0)
{
// 自定义界面
ItemWidget *pitemwidget = new ItemWidget();
pitemwidget->setWidgetInfo(str, label0);
// 将自定义界面放入item中
QListWidgetItem* pItem = new QListWidgetItem();
m_itemList->addItem(pItem);
m_itemList->setItemWidget(pItem, pitemwidget);
}
// 槽函数
void MainWindow::setListItemState(QListWidgetItem *current_item, QListWidgetItem *previous_item)
{
// 改变后被选中的item,调用自定义界面函数处理
ItemWidget *current_widget = dynamic_cast<ItemWidget*>(m_itemList->itemWidget(current_item));
current_widget->setActiveWidget(true);
// 改变前被选中的item
if (previous_item != nullptr) {
ItemWidget *previous_widget = dynamic_cast<ItemWidget*>(m_itemList->itemWidget(previous_item));
previous_widget->setActiveWidget(false);
}
}
默认显示的只有label,当选中某个item时,显示该item自定义界面的ABC三个按钮btn,并隐藏0号label,此状态下点击A按钮可以直接调用对应的槽函数;
如果考虑传参,可以用Lambda表达式(C++11)
// 与以上代码无关
struct XXX other;
connect(pBtn, &QPushButton::clicked, this, [=](){pBtnIsClicked(other);}