【问题标题】:Making an application bundle with Xcode, C++ and wxWidgets使用 Xcode、C++ 和 wxWidgets 制作应用程序包
【发布时间】:2021-05-06 14:13:38
【问题描述】:

我是 macOS 的新手,我正在尝试弄清楚如何制作应用程序包,这样我的代码就不会只是一个可执行文件。

我正在使用 xcode 12.5 版并使用 c++ 语言和 wxWidgets 库编写一个测试 gui 应用程序。

现在我尝试用一​​个按钮和一个菜单栏(屏幕顶部的栏有不同的菜单,如 File 或 About )制作一个简单的 gui。我遇到了 2 个问题:

  1. 第一个也是主要的一个是可执行文件启动时菜单栏没有响应,它只有在聚焦到另一个程序时才起作用,然后再聚焦到可执行文件上,然后菜单是可点击的并且可以工作。我读到这是因为我将程序构建为可执行文件而不是应用程序包。虽然,无法在 xcode 中弄清楚如何做到这一点,而且互联网也没有完全回答如何做到这一点。
  2. 仅触摸鼠标垫时按钮没有点击效果(必须点击才能产生蓝色点击效果),您必须按住按钮才能看到按钮变色。

代码:

应用的cpp文件(继承自wxApp)

bool instaStalkApp::OnInit(){
    instaFrame = new instaStalkFrame("InstaStalk", wxPoint(50,50), wxSize(P_WIDTH,P_HEIGHT));
    instaFrame->Show(true);
    SetTopWindow(instaFrame);
    
    mainPanel = new instaStalkPanel(instaFrame, ID_PANEL_MAIN, wxPoint(-1,-1), wxSize(P_WIDTH, P_HEIGHT), wxTAB_TRAVERSAL, "panel");
    
    testButton = new instaButton(mainPanel, ID_TEST_BUTTON_1, "test1" , wxPoint(P_WIDTH / 2 ,P_HEIGHT / 2), wxSize(100,20), "test1but");
    
    
    return true;
}

按钮类的头文件:

#ifndef instaButton_hpp
#define instaButton_hpp

#include <stdio.h>
#include <wx/wx.h>

class instaButton : public wxButton {
private:
    
public:
    instaButton(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos, const wxSize &size, const wxString &name);
    
    void On_Button1Click(wxCommandEvent &event);
    
    wxDECLARE_EVENT_TABLE();
};

#endif /* instaButton_hpp */

按钮事件表:

wxBEGIN_EVENT_TABLE(instaButton, wxButton)
    EVT_BUTTON(ID_TEST_BUTTON_1, instaButton::On_Button1Click)
wxEND_EVENT_TABLE()

自定义按钮的cpp文件

#include <wx/wx.h>

#include "instaButton.hpp"


instaButton::instaButton(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos, const wxSize &size, const wxString &name) : wxButton(parent, id, label, pos, size, 0, wxDefaultValidator, name){
    
}

void instaButton::On_Button1Click(wxCommandEvent &event){
    wxLogMessage("hi");
}

带有菜单栏的框架的cpp文件:

#include <wx/wx.h>

#include "instaStalkFrame.hpp"
#include "instaStalkPanel.hpp"
#include "consts.hpp"


instaStalkFrame::instaStalkFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size){
    
    menuFile = new wxMenu;
    menuFile->Append(ID_TEST, "&Hello...\tCtrl-H",
                        "Help string shown in status bar for this menu item");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);
    
    menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);
    
    menuBar = new wxMenuBar;
    menuBar->Append( menuFile, "&File" );
    menuBar->Append( menuHelp, "&Help" );
    
    SetMenuBar(menuBar);
    
}

void instaStalkFrame::OnExit(wxCommandEvent& event){
    Close(true);
}

void instaStalkFrame::OnAbout(wxCommandEvent& event){
    wxMessageBox( "This is a wxWidgets' Hello world sample",
                  "About Hello World", wxOK | wxICON_INFORMATION );
}

void instaStalkFrame::OnTest(wxCommandEvent& event){
    wxLogMessage("Test!");
}

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    为了制作一个应用程序包:

    您应该已经在 Xcode 中创建了一个 OSX 应用程序项目。检查 wxWiki(我知道它适用于旧版本的 Xcode,但它仍然适用,您可以尝试在新版本中匹配它)。

    如果你想稍后再做 - 你可以尝试从 wxWidgets 发行版构建minimal 样本,看看它使用什么来创建一个包并在你的测试程序中复制它。但是你绝对应该在 Xcode 中创建一个 Application Bundle 项目来简化你的生活。

    当您创建一个 Bundle 时,该菜单将开始工作。如你所愿。

    我认为没有实现悬停效果。你可以在 wx-users ML 上询问。

    如果您需要更多指导,请告诉我们。

    【讨论】:

    • 关于按钮,我不是说悬停。使用鼠标垫,您可以硬点击(按下鼠标垫点击)或只是触摸鼠标垫(不按下它)。当我按下按钮时变成蓝色,直到我抬起手指。但是当我通过触摸单击时,它不会产生任何效果(就像在其他应用程序中一样),只是启动绑定到该按钮的事件。关于捆绑包,xcode 中有一个选项可以在框架和库部分下选择捆绑包,我要选择那个吗?之后我需要做一些特别的事情吗?
    • @Wahalez,很抱歉,我没有那个 Xcode 版本,您可以在编写电子邮件 wx-users ML 时将其添加到有关按钮的问题中。不过,您需要先注册。但是您是否阅读过有关使用 Xcode 在 OSX 上的 wxWidgets 的 WiKi?
    • 我确实阅读了documentation,但没有发现任何有用的东西,至少对于 macOS 的绝对初学者来说不是
    • @Wahalez 你看到了吗:wiki.wxwidgets.org/…?
    • @wahalez,它在 wxWidgets/samples/minimal 中。一般而言,目录 wxWidgets/samples 包含有关不同控件/功能的示例代码,您可以使用这些代码查看如何实现某些东西或证明某些东西不起作用。并且只有最小的示例包含 Xcode 项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多