【问题标题】:Fl_Window subclass doesn't workFl_Window 子类不起作用
【发布时间】:2016-05-20 17:18:19
【问题描述】:

如上所述,我正在尝试让一个非常简单的 FLTK 1.3.3 应用程序正常工作。 但是,即使只有一个简单的 Fl_Window 和 1 个 Fl_Button,似乎也没有任何效果。有人可以帮忙吗?

class MainEditorWindow : public Fl_Window
{
public:
    MainEditorWindow(int _width, int _height, std::string _title);
    ~MainEditorWindow();

    virtual void draw();
    virtual int handle(int _event);
private:
    Fl_Button* m_btnExit;
};

这是实现

MainEditorWindow::~MainEditorWindow()
{

}

int MainEditorWindow::handle(int _event)
{
    return 1;
}

void MainEditorWindow::draw()
{
    m_btnExit->redraw();
}

MainEditorWindow::MainEditorWindow(int _width, int _height, std::string _title) : Fl_Window(_width, _height, _title.c_str())
{
    this->begin();
    m_btnExit = new Fl_Button(0, 0, 40, 40, "EXIT");
    m_btnExit->color(FL_RED);
    this->color(FL_WHITE);
    this->end();
}

但是当像这样简单地运行应用程序时:

int main(int argc, char** argv)
{
    MainEditorWindow* mw = new MainEditorWindow(800, 600, "SHIP Editor");
    mw->show(argc,argv);
    return Fl::run();
}

窗口显示得很好,它的可调整大小可移动等,draw() - 函数正在被调用等等。但是窗口本身只是空白。它什么也没有显示,尤其是Fl_Button。谁能告诉我为什么会这样?据我所知,我的代码应该没有什么特别的问题。

【问题讨论】:

  • 您不需要以某种方式将按钮添加到窗口吗?
  • @Hedanito 在begin()and() 之间创建小部件正是这样做的。
  • 我只能想象线程危险:|
  • @Hedanito 我也担心这一点——因为至少可以说 FLTKs API 已经过时了。不过他们有一个add(Fl_Widget*) 函数。

标签: c++ user-interface fltk


【解决方案1】:

你需要调用 Fl_Window::draw()

    void MainEditorWindow::draw()
    {
      m_btnExit->redraw();
      Fl_Window::draw();
    }

也许你希望按钮也可以点击

    int MainEditorWindow::handle(int _event)
    {
      //return 1;
      return(Fl_Window::handle(_event));
    }

【讨论】:

    【解决方案2】:

    在你的 MainEditorWindow 构造函数中试试这个:

    MainEditorWindow(int _width, int _height, const std::string& _title) 
            : Fl_Window(_width, _height, _title.c_str()) {
        // begin grouped GUI object creation
        Fl_Group::begin();
        // alter x,y coords of button as necessary
        m_btnExit = new Fl_Button(0,0,40,40,"EXIT");
        m_btnExit->color(FL_RED);
        // end grouped GUI object creation
        Fl_Group::end();
        // defines resizable widget for group
        Fl_Group::resizable(this);
        this->color(FL_WHITE);
        // display window
        Fl_Window::show();
    }
    

    然后在main中:

    int main(int argc, char** argv) {
        MainEditorWindow mw(800, 600, "SHIP Editor");
        return Fl::run();
    }
    

    这里我们将按钮添加到一个组中,然后在构造函数中调用Fl_Window::show() 来显示它。

    请注意,在main 中无需将mw 设为指向MainEditorWindow 的指针。

    【讨论】:

    • @calcyss 尝试改变按钮的 (x,y) 坐标(Fl_Button 构造函数的前 2 个参数)
    • 问题似乎出在Fl_Window 的子类化上。我尝试简单地创建一个 Fl_Window 并向其添加一个按钮,这很有效。
    • 你可以尝试创建Fl_Window的子类吗?
    • 我有一个我不久前制作的 fltk 应用程序,它使用与我上面的答案类似的代码结构并且这有效,但我可以在一段时间内尝试另一个测试用例。
    • hm... 用Fl_Window::draw(); 调用基类draw() 方法成功了,它现在可以工作了。很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多