【问题标题】:Creating a pointer to a widget(wxTextCtrl) in a function在函数中创建指向小部​​件(wxTextCtrl)的指针
【发布时间】:2014-05-27 16:19:42
【问题描述】:

我试图获取一个指向小部件的指针(在代码中它被命名为 text)。但至少我只有这个

错误:没有匹配函数调用'std::basic_ostream::basic_ostream(wxWindow*)'

我的代码: gui.h

#include <wx/wx.h>

class wxWCK : public wxFrame
{
public:
    wxWCK(const wxString& title);

    void OnClickCon(wxCommandEvent& event);
    void OnClickSta(wxCommandEvent& event);

private:
    wxButton *connect;
    wxButton *start;
    wxTextCtrl *text;
};

const int ID_CON = 100;
const int ID_STA = 101;
const int ID_MF0 = 102;
const int ID_TEX = 103;

void Connect();
void Start();

gui.cpp #include "gui.h"

wxWCK::wxWCK(const wxString& title)
    : wxFrame(NULL, ID_MF0, title, wxDefaultPosition, wxSize(400,300))
{
    wxPanel *panel = new wxPanel(this, -1);

    wxBoxSizer *vbox  = new wxBoxSizer(wxVERTICAL);
    wxBoxSizer *hbox1 = new wxBoxSizer(wxHORIZONTAL);
    wxBoxSizer *hbox2 = new wxBoxSizer(wxHORIZONTAL);   

    //Outputwidget
    text = new wxTextCtrl(panel, ID_TEX, _T(""), 
        wxPoint(-1, -1), wxSize(1000, 1000), wxTE_MULTILINE);

    //redirecting stream to the outputwidget
    //std::ostream stream(text);    
    stream << "Hello" << std::endl;

    connect = new wxButton(panel, ID_CON, _T("Connect"));
    start   = new wxButton(panel, ID_STA, _T("Start"));

    hbox1->Add(text);
    hbox2->Add(connect);
    hbox2->Add(start);

    vbox->Add(hbox1, 1, wxEXPAND);
    vbox->Add(hbox2, 0, wxALIGN_LEFT | wxRIGHT | wxBOTTOM, 10);

    panel->SetSizer(vbox);

    Connect(ID_CON, wxEVT_COMMAND_BUTTON_CLICKED,
        wxCommandEventHandler(wxWCK::OnClickCon));
    //Connect(ID_STA, wxEVT_COMMAND_BUTTON_CLICKED,
    //  wxCommandEventHandler(wxWCK::OnClickSta));
}

void wxWCK::OnClickCon(wxCommandEvent& WXUNUSED(event))
{   void Connect(); }

void wxWCK::OnClickSta(wxCommandEvent& WXUNUSED(event))
{   void Start();   }

void Connect()
{
    //Try to get a pointer to 'text'
    std::ostream stream(wxWindow::FindWindowById(ID_TEX));  
    stream << "Connected" << std::endl;
}
/*
void Start()
{
    //Try to get a pointer to 'text'
    std::ostream stream(wxWindow::FindWindowById(ID_TEX));  
    stream << "Started" << std::endl;
}
*/

我希望有人可以帮助我。另一种解决方案是将 stream 设为全局。但是当我尝试在标题中获取流声明时,他说他不知道任何 text 所以我将文本声明移到类之外,我得到了一个多重声明错误......我想,因为我在 gui.cpp 和 main.h 中包含了 gui.h 。 -Casisto

编辑: 我将函数更改为:

void Connect()
{
    //Try to get a pointer to 'text'
    std::ostream stream((wxTextCtrl*) wxWindow::FindWindowById(ID_TEX));
    stream << "Connected" << std::endl;
}

现在我没有收到错误或警告,但是当我单击“连接”按钮时,wxTextCtrl 没有“输入”(我的意思是,那里只有“你好”)

【问题讨论】:

  • std::ostream stream(wxWindow::FindWindowById(ID_TEX)); 你可能想打电话给 s.th。就像那里的GetText() 一样,将它传递给std::ofstream。您不能创建std::ostream 的实例,它是一个抽象类。
  • 好的,你能说点别的吗?我不知道你想给我什么建议。
  • 我可以放在这里的最接近的词:wxTextCtrl::GetLineText()std::ofstream,或者您的意思是文档中的wxTextCtrl and C++ Streams 部分?
  • 我的意思是最后一个,wxtextCtrl 和 C++。
  • 您的问题现在与原来的问题没有任何共同之处。您可能应该创建一个新的。

标签: c++ wxwidgets


【解决方案1】:

初始错误一定来自Connect() 的旧代码,因为wxWindow::FindWindowById() 返回wxWindow*

首先要尝试:将wxWCK::OnClickCon() 更改为{ (*text) &lt;&lt; "Connected\n"; }。这应该可以工作。

接下来,如果你真的需要那个void Connect(),再试一次,不要创建std::ostream(你真的不需要它);类似{ (*(wxTextCtrl*)wxWindow::FindWindowById(ID_TEX)) &lt;&lt; "Connected\n"; }。 但是,这可能仍然无法正常工作,因此请制作ID_CON = wxID_HIGHEST + 1ID_STA = wxID_HIGHEST + 2 等,然后再试一次。 IIRC 我见过低值 id 引起奇怪行为的案例。

【讨论】:

  • 嗨,当我使用你的代码行时,我收到错误:'wxTextCtrl*' 和 'const char [11]' 类型的无效操作数到二进制 'operator
  • doh,当然会出错。我已将代码 sn-ps 更改为使用带有 operator*text 而不是 text
【解决方案2】:

错误消息与您显示的代码不符,其中textwxTextCtrl,它派生自std::streambuf,因此可用于构造关联的std::ostream,而不是@987654325 @。

IOW 你的代码应该可以正常工作,你一定没有向我们展示一切。

【讨论】:

  • 您好,但代码现在(编辑后)正在运行,但如果我使用按钮,则没有任何反应。知道为什么?
猜你喜欢
  • 2023-03-12
  • 2021-11-26
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多