如何在 macOS 上为 Qt 窗口使用 Objective-C 变量和方法?

Posted

技术标签:

【中文标题】如何在 macOS 上为 Qt 窗口使用 Objective-C 变量和方法?【英文标题】:How do I use Objective-C variables and methods for a Qt window on macOS? 【发布时间】:2018-04-18 07:10:01 【问题描述】:

我在 Qt 项目中有以下代码,我想在 Objective-C 中将窗口的 titlebarAppearsTransparent 变量设置为 true。程序编译正确,但是当它到达 [&w titlebarAppearsTransparent:YES]; 时它崩溃了我正在尝试做的事情是否可能,如果可以,我该如何解决?

#include "mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QDebug>
#include <QDir>
#include "globals.h"

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import <AppKit/NSWindow.h>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QApplication::setOrganizationName("Siddha Tiwari");
    QApplication::setApplicationName("NarwhalEdit");

    MainWindow *w = new MainWindow();

    [&w titlebarAppearsTransparent:YES];

    setTheme(true);

    w->show();

    return a.exec();

【问题讨论】:

目前无法测试,但您是否查看过 bugtracker here ?特别是看cmets中的代码。 值得注意的是,您可以将 Qt QtMacExtras 类与 Qt 一起使用,虽然这并不是真正混合代码,但您仍然可以在这些帖子 Mixing Qt C++ with Objective-C .. 和 Calling Objective-C method from C++ method? 之后混合代码 @S.Monteleone 谢谢,bugtracker 中的解决方案奏效了 @SiddhaTiwari:很高兴它成功了。为了方便起见,我写下了完整的答案。 【参考方案1】:

可以使用 native API 来完成此操作,正如 here 所报告的那样,从 QWidget::window(): 获取 NSWindow 指针: winId().

我还建议使用条件编译指令包装代码,因此在为其他平台编译时会被忽略。

这是一个 sn-p(假设 w 是指向您的 QMainWindow 的指针):

#ifdef Q_OS_MAC

QCoreApplication::setAttribute( Qt::AA_DontCreateNativeWidgetSiblings );
NSView *nsview = ( __bridge NSView * )reinterpret_cast<void *>( w->window()->winId() );
NSWindow *nswindow = [nsview window];
nswindow.titlebarAppearsTransparent = YES;

#endif

【讨论】:

以上是关于如何在 macOS 上为 Qt 窗口使用 Objective-C 变量和方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 macos 上为 ffmpeg 启用 libx264

如何在 macOS 上为 IntelliJ 项目安装 Google OR-Tools

如何在 MacOS (sierra-catalina) 上为分区获取可用空间

如何在 MacOS 12 上为 php 7.1 安装 mcrypt 扩展以进行 Laravel 开发?

如何在 10.6 上为 OS X 10.5 构建 Qt

在 MacOS 上为 Flutter 安装 cocoapods 时出现问题