QCombox的列表是个popup控件,基本就是个toplevel窗口,要想圆角可不容易,光用qss肯定是不能实现的。
首先因为列表本身并不是窗口(外面还有一个container),所以你的方法要改一下。
ui->comboBox->view()->window()->setWindowFlag(Qt::FramelessWindowHint, true);
ui->comboBox->view()->window()->setAttribute(Qt::WA_TranslucentBackground);
但是我测试下来这样好像不能完美隐藏四个角。
补充:经过比较测试,普通的Frameless窗口可以,Popup不可以(但是这个必须要用Popup否则会工作不正常),并且应该是由于windows绘制的窗口阴影导致,如果把系统的窗口阴影设置关掉就可以,总之不是肯定有效,所以还是不要用上面这个办法。
比较靠谱的我能想到的只有用mask了。不过mask必须动态根据窗口大小来设置,可以用eventFilter处理resize事件。如果你的列表是个自定义类的view那可以直接在它的resizeEvent()处理
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
...
ui->comboBox->view()->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::Resize && obj == ui->comboBox->view()) {
QWidget* w = ui->comboBox->view()->window();
int radius = 14;
QBitmap bm(w->size());
bm.fill(Qt::color0);
QPainter p;
p.begin(&bm);
p.setBrush(Qt::color1);
p.setRenderHint(QPainter::Antialiasing);
p.drawRoundedRect(w->rect(), radius, radius);
p.end();
w->setMask(bm);
}
return QWidget::eventFilter(obj, event);
}
这样不算很平滑但效果还算凑合了
补充:经过调试发现,ui->comboBox->view()->window()也就是列表外面那个container窗口本身的resizeEvent里有clearMask()的处理,所以这边安装eventFilter的一定要是ui->comboBox->view()而不是ui->comboBox->view()->window(),因为ui->comboBox->view()的resize事件发生在后面,所以前面把mask清除了下一步马上又设置了,否则就是反过来的,刚设完又被清除,不会有效果。