Objective-C ++ / Какао пытается создать окно с кнопкой, не работает? - PullRequest
3 голосов
/ 15 июня 2011

Я должен создать класс c ++ с методами c ++, которые сделаны из target-c и используют какао, но теперь я столкнулся с проблемой и просто не могу ее решить, потому что ядовольно новый в объективе-c.Также дело в том, что я должен иметь возможность создавать окна и кнопки из C ++.Поэтому, когда я собираю и запускаю эту программу, она запускается, но затем мгновенно переходит в состояние «не отвечает».В любом случае вот что я получил:

Window.h

#ifndef WINDOW_H
#define WINDOW_H

class Window {
    public:
        Window();
        void createButton();
};

#endif

Window.mm

#include "Window.h"
#include "Button.h"

Window::Window(){
    NSWindow *window = [[NSWindow alloc]
        initWithContentRect: NSMakeRect(100, 100, 200, 200)
        styleMask: NSTitledWindowMask | NSMiniaturizableWindowMask
        backing: NSBackingStoreBuffered
        defer: NO];
    [window setTitle: @"Test window"];
}

void Window::createButton(){
    Button *button;
    [[this contentView] addSubView: button];
// word this gives warning: no '-addSubView:' method found
// this is probably causing the problem I have
    }

Button.h

class Button{
    Button();
};
// There will be more methods here eventually

Button.mm

#include "Button.h"
Button::Button(){
    NSButton *button = [[NSButton alloc]
        initWithFrame: NSMakeRect(14, 100, 120, 40)];
    [button setTitle: @"Hello world"];
    [button setAction: @selector(invisible)];
    [button setBezelStyle: NSRoundedBezelStyle];
    [button setButtonType: NSMomentaryLightButton];
    [button setBezelStyle: NSTexturedSquareBezelStyle];
}

Main.cpp

#include "Window.h"
#include "Button.h"

int main(int argc, char *argv[]){
    Window x;
    x.createButton();
}

Итак, есть ли у кого-нибудь идеи, почему это не работает, как я уже говорил, я довольно новичок в Cocoa и Objective-C, все еще учусь: P И да, я пытался это исправить.

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

[[this contentView] addSubView: button];

Как вы подозреваете, это вызывает вашу проблему. «Это» не относится к окну; это относится к самому классу. (Помните, ваш класс не является подклассом NSWindow)

Один из вариантов - объявить ваше NSWindow в заголовке, чтобы его можно было использовать глобально. Так что сделайте свой заголовок:

#ifndef WINDOW_H
#define WINDOW_H

class Window {
    public:
        Window();
        void createButton();
        NSWindow *window;
};

#endif

А затем измените вышеупомянутую строку на:

[[window contentView] addSubview: button]; (Также обратите внимание на исправление заглавных букв в 'addSubview')

Это аналогичная проблема с вашим конструктором кнопок. Вы создаете NSButton, но эта кнопка больше не видна и не слышна.

3 голосов
/ 15 июня 2011

Ваша функция main не выполняет цикл выполнения, поэтому системы рисования и обработки событий не будут отвечать на запросы.

Вы никогда не будете показывать созданное вами окно.

Надеюсьне видите, где вы сохраняете объекты Какао, чтобы ваш C ++ API мог ими манипулировать.Например, ваш конструктор Window не сохраняет созданное окно в переменную-член, поэтому у вас не будет возможности манипулировать этим окном после его создания.

...