由于QComboBox下拉框每个item项需要引入一些控件,比如头像,删除按钮等,因此需要引用QListWidget,去添加带头像按钮等控件的窗口来实现,如以下部分代码:
m_Accountlist = new QListWidget();
ui.comboBox->setModel(m_Accountlist->model());
ui.comboBox->setView(m_Accountlist);
ui.comboBox->setMaxVisibleItems(4);
for (int i = 0; i < m_userNameList.size(); i++)
{
AccountItem *account_item = new AccountItem();
account_item->setAccountInfo(i, m_userNameList[i]);
connect(account_item, &AccountItem::signalShowAccountInfo, this, &VLoginWidget::sltShowAccountInfo);
connect(account_item, &AccountItem::signalRemoveAccount, this, &VLoginWidget::sltRemoveAccount);
QListWidgetItem *list_item = new QListWidgetItem(m_Accountlist);
m_Accountlist->setItemWidget(list_item, account_item);
}
但是这种做法在一些电脑环境下会出现item项拖动导致界面异常问题
最开始想到的是设置QListWidget不可拖放属性,包括设置item项不可拖放属性,都还是存在这个问题。
最后经过QComboBox的showPopup信号进行item调试,发现item项数目一直是正确的,异常的只是界面显示,尤其是滑动条拖动底部的时候,再次打开下拉框就会出现界面异常问题
解决方案就是重新将滑动条移到顶部,这样不会导致item向下拉时,滑动条超过了临界值,导致最上面的item项无法显示。
connect(ui.comboBox, &ComboBox::sigHidePopup, this, [=]() {
ui.comboBox->view()->verticalScrollBar()->setSliderPosition(0);
});