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

C++ 如何在macOS上为Qt窗口使用Objective-C变量和方法?,c++,objective-c,qt,qt-creator,appkit,C++,Objective C,Qt,Qt Creator,Appkit,我在一个Qt项目中有以下代码,我想在Objective-C中将窗口的titleBarAppearTransparent变量设置为true。该程序编译正确,但到达[&w titleBarAppearTransparent:YES]时崩溃是我正在尝试做的事情甚至是可能的,如果是这样,我如何修复它 #include "mainwindow.h" #include <QApplication> #include <QFile> #include <QDebug> #i

我在一个Qt项目中有以下代码,我想在Objective-C中将窗口的titleBarAppearTransparent变量设置为true。该程序编译正确,但到达
[&w titleBarAppearTransparent: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();
}
#包括“mainwindow.h”
#包括
#包括
#包括
#包括
#包括“globals.h”
#进口
#进口
#进口
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QApplication::setOrganizationName(“Siddha Tiwari”);
QApplication::setApplicationName(“Narhaledit”);
主窗口*w=新的主窗口();
[&w标题栏:是];
设定主题(真);
w->show();
返回a.exec();
}

如报告所述,可以使用本机API从QWidget::window()::winId()获取NSWindow指针来完成此操作

我还建议用条件编译指令包装代码,这样在为其他平台编译时就可以忽略它

下面是一个代码段(假设w是指向QMainWindow的指针):

#ifdef Q#u OS#u MAC
QCoreApplication::setAttribute(Qt::AA_dontcreateNativeWidgetSides);
NSView*NSView=(\u桥NSView*)重新解释强制转换(w->window()->winId());
NSWindow*NSWindow=[nsview窗口];
nswindow.titlebarAppearsTransparent=是;
#恩迪夫

现在无法测试,但您是否查看了bugtracker?特别是,请看注释中的代码。值得注意的是,您可以将Qt类与Qt一起使用,虽然这并不是真正的混合代码,但您仍然可以在以下文章中混合代码。。还有@S.monteleon谢谢,bugtracker中的解决方案worked@SiddhaTiwari字体很高兴它起作用了。为了方便起见,我写下了完整的答案。
#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