一个小菜鸡的学习记录。 2023-12-07 18:59 采纳率: 71.4%
浏览 13
已结题

QCombox 的view 的三角可以去掉吗?

1.这是QSS 样式


QComboBox QAbstractItemView {
    background: #33353E;
    border-radius: 14px;
    padding:10px;
    border: 1px solid yellow;
    outline: 0px solid green;
}

2,这是效果

img

  1. 查询到的解决方式
    ui->comboBox->view()->setWindowFlags(Qt::FramelessWindowHint);
    ui->comboBox->view()->setAttribute(Qt::WA_TranslucentBackground);
    设置这两个是无效的,WA_TranslucentBackground属性会使border-radius属性失效

3,请问 QCombox 的view 的三角可以去掉吗?

  • 写回答

2条回答 默认 最新

  • mideum 2023-12-08 13:45
    关注

    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清除了下一步马上又设置了,否则就是反过来的,刚设完又被清除,不会有效果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 创建了问题 12月7日

悬赏问题

  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息