Qt项目移植到mac上一些问题汇总

本文探讨了在Mac OS环境下修复视图模型委托、列表项重叠、QCheckBox样式问题,监听全屏显示和titlebar设置。此外,还提供了处理鼠标悬停、QComboBox异常和子窗体全屏显示的工作arounds。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,fix viewmodeldelegate not update method paint when mouse hover in macOS or xp
listView_->viewport()->setAttribute(Qt::WA_Hover,true);

2,fix 列表Item重叠
QListWidgetItem *ITEM = new QListWidgetItem();
myLiveListItem->setWidgetItem(ITEM);
QSize size = ITEM->sizeHint();
//ITEM->setSizeHint(QSize(size.width(), 146));
ITEM->setSizeHint(QSize(0, 146));

3,QCheckBox在自定义选中样式,在某些情况下无效时,添加如下:
        <property name="focusPolicy">
         <enum>Qt::NoFocus</enum>
        </property>

4,监听全屏显示
void MainWindow::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::WindowStateChange){
        if((windowState() & Qt::WindowFullScreen)){
            if(likeWidget_){
                likeWidget_->setOffsetBottom(ui->widgetToolBar->height());
            }
            ui->meetOperatorBtn->hide();
            ui->widget->layout()->removeWidget(ui->widgetToolBar);
            ui->widgetToolBar->move(0, this->height() - ui->widgetToolBar->height());
        }
    }
}

5,titlebar的设置(注意下面代码所在的文件后缀需要是.mm)
extern "C" void hideTitleBarButton(WId winId, bool minBtnVisible, bool closeBtnVisible, bool zoomBtnVisible)
{
    if (winId == 0) {
        return;
    }

    NSView* view = (NSView*)winId;
    NSWindow* window = [view window];
    window.titlebarAppearsTransparent = YES;

    NSButton *button = [window standardWindowButton:NSWindowMiniaturizeButton];
    button.hidden = !minBtnVisible;
    button.enabled = minBtnVisible;

    button = [window standardWindowButton:NSWindowCloseButton];
    button.hidden = !closeBtnVisible;
    button.enabled = closeBtnVisible;

    button = [window standardWindowButton:NSWindowZoomButton];
    button.hidden = !zoomBtnVisible;
    button.enabled = zoomBtnVisible;

    // NSWindowStyleMaskFullSizeContentView 设置TitleBar不额外占用空间
    window.styleMask = NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable
            | NSWindowStyleMaskResizable | NSWindowStyleMaskTitled
            | NSWindowStyleMaskFullSizeContentView;
}

6setWindowFlags(Qt::Popup t);mac上点击空白不会消失
修改dialog.exec()为dialog->show()

7,workaround : mac下mouse hover一些情况下一直保持
extern void clearMouseHover(QWidget * widget);
void clearMouseHover(QWidget *widget)
{
#ifdef __APPLE__
    if(widget){
        widget->setAttribute(Qt::WA_UnderMouse, false);
        QHoverEvent hoverEvent(QEvent::HoverLeave, QPoint(40, 40), QPoint(0, 0));
        QCoreApplication::sendEvent(widget, &hoverEvent);
    }
#endif
}

8,mac上QCombox一条数据时,点击显示下拉框异常
对应的UI上添加样式QComboBox{combobox-popup:0};
或者代码里统一设置
application.setStyleSheet(a.styleSheet() + "QComboBox{combobox-popup:0}");

9,fix mac 主窗体在全屏时(专注模式下)其它子窗体在本屏幕叠加显示
/**
 * workaround : mac 主窗体在专注模式下其它子窗体在本屏幕叠加显示
 *
 * 注意:该方法中subWindow的parent最终会被设置为null
 *
 * @brief setSubWindowInFullScreenParent
 * @param parentWindow 全屏的窗体
 * @param subWindow 显示在全屏窗体上的“子窗体”
 */
extern void setSubWindowInFullScreenParent(QWidget * parentWindow , QWidget * subWindow);
void setSubWindowInFullScreenParent(QWidget * parentWindow , QWidget *subWindow)
{
#ifdef __APPLE__
    if(parentWindow && parentWindow->isFullScreen() && subWindow){
        subWindow->setParent(parentWindow);
        subWindow->setParent(nullptr);
        subWindow->setWindowFlags(subWindow->windowFlags() | Qt::Dialog);

    }
#endif
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值