WxWidgets - изменение texbox из файла, отличного от основного - PullRequest
1 голос
/ 24 ноября 2011

ПРИМЕЧАНИЕ. Я полностью пересмотрел вопрос и превратил его в пример проекта специально для этого вопроса, поэтому ответ Никса больше не имеет смысла.wxQuestionMain.h и wxQuestionMain.cpp - это слегка модифицированные файлы wxWidget, автоматически генерируемые Code :: Blocks.

go

Когда я нажимаю кнопку «Перейти», я хочу, чтобы событие кнопки в«wxQuestionMain.cpp» для вызова «somefunction ()», которая находится внутри «otherFile.cpp».Это работает просто отлично.Но затем я хочу изменить текст в текстовом поле «txtCtrl1» изнутри «somefunction ()», и это не сработает, потому что «somefunction ()» не является частью класса wxWidget, и я не хочу, чтобы он был,Класс wxwidget создается в "wxQuestionMain.h".

wxQuestionMain.h -> Просто создает класс

#ifndef WXQUESTIONMAIN_H
#define WXQUESTIONMAIN_H
#define BOOST_FILESYSTEM_VERSION 2

#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

#include "wxQuestionApp.h"


#include <wx/button.h>
#include <wx/statline.h>
class wxQuestionDialog: public wxDialog
{
    public:
    wxQuestionDialog(wxDialog *dlg, const wxString& title);
    ~wxQuestionDialog();

    protected:
    enum
    {
        idBtnGo = 1000
    };
    wxStaticText* m_staticText1;
    wxStaticLine* m_staticline1;
    wxButton* BtnGo;
    wxTextCtrl* textCtrl1;

    private:
    void OnClose(wxCloseEvent& event);
    void OnGo(wxCommandEvent& event);
    DECLARE_EVENT_TABLE()
};

void somefunction();

#endif // WXQUESTIONMAIN_H

wxQuestionMain.cpp -> Множество Ядда Ядда, а затем в самомвнизу функция, которая обрабатывает событие clickclick.

#ifdef WX_PRECOMP
#include "wx_pch.h"
#endif

#ifdef __BORLANDC__
#pragma hdrstop
#endif //__BORLANDC__

#include "wxQuestionMain.h"

//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
    wxbuild << _T("-Windows");
#elif defined(__WXMAC__)
    wxbuild << _T("-Mac");
#elif defined(__UNIX__)
    wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
    wxbuild << _T("-Unicode build");
#else
    wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}


BEGIN_EVENT_TABLE(wxQuestionDialog, wxDialog)
    EVT_CLOSE(wxQuestionDialog::OnClose)
    EVT_BUTTON(idBtnGo, wxQuestionDialog::OnGo)
END_EVENT_TABLE()

wxQuestionDialog::wxQuestionDialog(wxDialog *dlg, const wxString &title)
    : wxDialog(dlg, -1, title)
{
    this->SetSizeHints(wxDefaultSize, wxDefaultSize);
    wxBoxSizer* bSizer1;
    bSizer1 = new wxBoxSizer(wxHORIZONTAL);
    m_staticText1 = new wxStaticText(this, wxID_ANY, wxT("Welcome To\nwxWidgets"), wxDefaultPosition, wxDefaultSize, 0);
    m_staticText1->SetFont(wxFont(20, 74, 90, 90, false, wxT("Arial")));
    bSizer1->Add(m_staticText1, 0, wxALL|wxEXPAND, 5);
    wxBoxSizer* bSizer2;
    bSizer2 = new wxBoxSizer(wxVERTICAL);

    wxPoint textCtrl1Position(5,5); //Position
    wxSize textCtrl1size(120,25); //Size
    textCtrl1 = new wxTextCtrl(this, wxID_ANY, "hi", wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, "textCtrl1"); //Create textCtrl
    bSizer2->Add(textCtrl1, 0, wxALL|wxEXPAND, 5); //Add to sizer

    m_staticline1 = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
    bSizer2->Add(m_staticline1, 0, wxALL|wxEXPAND, 5);
    BtnGo = new wxButton(this, idBtnGo, wxT("&Go"), wxDefaultPosition, wxDefaultSize, 0);
    bSizer2->Add(BtnGo, 0, wxALL, 5);
    bSizer1->Add(bSizer2, 1, wxEXPAND, 5);
    this->SetSizer(bSizer1);
    this->Layout();
    bSizer1->Fit(this);
}


wxQuestionDialog::~wxQuestionDialog()
{
}

void wxQuestionDialog::OnClose(wxCloseEvent &event)
{
    Destroy();
}

void wxQuestionDialog::OnGo(wxCommandEvent &event)
{
    somefunction();
}

otherFile.cpp:

#include "wxQuestionMain.h"

void somefunction()
{
    //Try to change the text in textCtrl1
    wxQuestionDialog::textCtrl1->AppendText("Red text\n");
}

Производит:

error: ‘wxTextCtrl* wxQuestionDialog::textCtrl1’ is protected
error: invalid use of non-static data member ‘wxQuestionDialog::textCtrl1’

Итак, я переместил 'wxTextCtrl * textCtrl1;'в файле 'wxQuestionMain.h' от 'защищенного' до 'публичного'

Производит:

error: invalid use of non-static data member ‘wxQuestionDialog::textCtrl1’

Кажется, что класс в wxQuestionMain.h содержит класс wxQuestionDialog: public wxDialog '

Я не знаю, что означает эта «публичная» часть, я никогда раньше не видел, чтобы такой класс создавался, но я собираюсь попытаться изменить «otherFile.cpp», чтобы вместо wxQuestionDialog было указано wxDialog.

#include "wxQuestionMain.h"

void somefunction()
{
    //Try to change the text in textCtrl1
    wxDialog::textCtrl1->AppendText("Red text\n");
}

Производит:

error: ‘textCtrl1’ is not a member of ‘wxDialog’

Я в недоумении здесь ... как я могу обновить текст в "textCtrl1", не добавляя "somefunction ()" в wxWidgetclass?

CodeBlocks автоматически сгенерировал 2 других файла, не уверен, что они важны, но вот они.

wxQuestionApp.cpp

#ifdef WX_PRECOMP
#include "wx_pch.h"
#endif

#ifdef __BORLANDC__
#pragma hdrstop
#endif //__BORLANDC__

#include "wxQuestionApp.h"
#include "wxQuestionMain.h"

IMPLEMENT_APP(wxQuestionApp);

bool wxQuestionApp::OnInit()
{

    wxQuestionDialog* dlg = new wxQuestionDialog(0L, _("wxWidgets Application Template"));

    dlg->Show();
    return true;
}

wxQuestionApp.h

#ifndef WXQUESTIONAPP_H
#define WXQUESTIONAPP_H

#include <wx/app.h>

class wxQuestionApp : public wxApp
{
    public:
    virtual bool OnInit();
};

#endif // WXQUESTIONAPP_H

1 Ответ

1 голос
/ 24 ноября 2011

addtolistbox2 - это метод закрытого члена gfxDialog - даже если у вас действительно был правильно сконструированный объект, вы не сможете вызвать этот метод извне gfxDialog экземпляра. По крайней мере минимум вам нужно переместить addtolistbox2 в public: из private:, а затем вызвать его для правильно сконструированного экземпляра (конструктор требует аргументы, но ваш код их не предоставляет):

gfxDialog testtime(0, "test");
testtime.addtolistbox2("somestring");

(Единственный допустимый конструктор требует родительского диалога и строки заголовка:

class gfxDialog: public wxDialog
{
    public:
    gfxDialog(wxDialog *dlg, const wxString& title);

если я правильно помню свои wxWidgets, родитель может быть НЕДЕЙСТВИТЕЛЕН, но, конечно, вы все равно должны предоставить аргумент)

...