项目中经常碰到点击一个输入框,弹出下拉列表,选择下拉列表中的选项后,下拉列表消失。很显然这里要用到PopUp属性。本来此次是对QListWidget对象设置了PopUp属性,但是发现不生效。原因是我们的QListWidget可能不具备Qt::Window属性。因此我们可以想到可以对QListWidget对象包一层具有Window属性的控件。下面来看看我的实现
例如我们对一个QLineEdit增加一个下拉按钮
QToolButton* pBtn = new QToolButton;
connect(pBtn, &QToolButton::clicked, this, &MainWindow::slotShowList);
pBtn->setCursor(Qt::ArrowCursor);//如果不设置鼠标样式,鼠标移动到按钮上依旧显示为编辑框的鼠标样式。
QWidgetAction* action = new QWidgetAction(ui->lineEdit);
action->setDefaultWidget(pBtn);
ui->lineEdit->addAction(action, QLineEdit::TrailingPosition);
要想下拉按钮点击展开列表,并且能够点击其他地方能够消失。要想解决这个问题,可以对要显示的QListWidget对象外层加一个QWidget,然后对QWidget使用PopUp属性,发现这样设置后生效
QWidget* pWidget = new QWidget(this);
pWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
QListWidget* pListWidget = new QListWidget(pWidget);
pWidget->setFixedSize(100, 200);
pListWidget->setFixedSize(100, 200);
pListWidget->addItem("beijing");
pListWidget->addItem("shanghai");
pListWidget->addItem("shenzhen");
还有要注意的是,一旦设置窗口的属性是Popup之后,该窗口的位置需要用全局坐标控制
QPoint pos = this->mapToGlobal(ui->lineEdit->geometry().bottomRight());
pWidget->move(pos.x() - pWidget->width(), pos.y());
pWidget->show();