如何在单击按钮的确切时刻获取小部件的值 FLTK

How can I get the value of a widget the exact moment a button is clicked FLTK

目标是在我单击我的按钮时能够获取 FL_Input 等小部件的值。

我可以做到这一点的一种方法是使用事件和 类。如

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <iostream>
using namespace std;

class MyButton : public Fl_Button
{
    static int count;
public:
    MyButton(int x, int y, int w, int h, const char*l = 0)
        :Fl_Button(x, y, w, h, l) {}

    int handle(int e)
    {
        int ret = Fl_Button::handle(e);
        //test - - - cout << endl << count++ << " ******** button " << label() << " receives ";


        switch (e)
        {
        case FL_PUSH:
            trigger..
            break;


        }
        return(ret);
    }

};

int MyButton::count = 0;

void but_a_cb(Fl_Widget* w, void* v) {
    cout << endl << "Button A callback!" << endl;
}


int main()
{
    Fl_Window win(120, 150);
    win.begin();

    MyButton but_a(10, 10, 100, 25, "A");
    but_a.shortcut('a');
    but_a.callback(but_a_cb);


    win.end();
    win.show();
    return(Fl::run());
}

但是,这对我来说不是最佳方式,因为我想获取多个输入并将它们放入向量中并在此使用它们。为此,我正在考虑将 return 输入值的输入回调,我会使用“Fl_Input->when(FL_CHANGED)”

我最好能够通过使用主函数中的代码而不是按钮来获取值并将它们放入按钮单击时的向量中,因为这需要我重新编写我的程序来实现它。

仅仅在 main 中声明向量是行不通的,因为它在表单加载时获取值。

总结一下,我想知道如何创建类似 if 语句的东西,当单击按钮时触发该语句以在单击按钮时获取 fl_inputs 的值。 T

请注意,我将使用数据库实现它,以便我需要它与 CLR 一起工作

我想到的额外代码

void done_cb(Fl_Widget* w, void* param)
{
    Fl_Input* i = (Fl_Input*)param;
    string inputstring = i->value();
    cout << inputstring;

    // What i tried for the vectors
    //vector<Fl_Input*> v = *reinterpret_cast<vector<Fl_Input*> *>(param);
    //string inputstring = v[0]->value();
    //cout << inputstring;
    
}
void signupScreen (void) {

    Fl::event_dispatch(myHandler);
    

    Fl_Window *window = new Fl_Window(200, 150);
    window->begin();
    int x = 50, y = 10, w = 100, h = 30;

    y += 35;
    

    y += 35;
    Fl_Input *input2 = new Fl_Input(x, 10, w, h, "str");
    
    Fl_Button* done = new Fl_Button(x, y, 100, h, "Done");
    done->when(FL_WHEN_CHANGED);
    
    string strinput;

    //strinput = input2->value();
    
    //input2->when(FL_WHEN_CHANGED);

        
    //std::vector<Fl_Input*> v = { input2 };
    done->callback(done_cb, input2);

    

    cout << strinput;
    
    window->end();
    

    window->show();
    
}


您可以定义一个新的 class 派生自 Fl_Input,它有一个 std::vector<std::string> 类型的成员,您可以在其中存储输入字段中写入的文本。

#ifndef __MYINPUT_H
#define __MYINPUT_H
#include <FL/Fl_Window.H>
#include <FL/Fl.H>
#include <FL/Fl_Input.H>
#include <iostream> 
#include <vector>


class myinput: public Fl_Input
{    
    public:
        /* 
        Instead of setting it public, you may create get and set methods.
        */
        std::vector<std::string> _storing;
        // Constructor 
        myinput(int x, int y, int h, int l, std::vector<std::string> S, const char* ll = 0);
        ~myinput(){};
        
};

#endif

.ccp 文件:

#include <myinput.hpp>

myinput::myinput(int x, int y, int h, int l,std::vector<std::string> S,const char* ll):Fl_Input(x, y, h,l,ll)
{
    _storing = S;
}

那么,你就可以像下面这样使用了:

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <myinput.hpp>
#include <FL/Fl_Button.H>

void add_cb(Fl_Widget* w, void* p){
    myinput* i = (myinput*)p;
    std::string inputstring = i->value();
    i->_storing.push_back(inputstring);

    // Just to show that it is working
    std::cout<< "Updated string:" << std::endl;
    for (int j=0; j<i->_storing.size(); j++ )
        std::cout << i->_storing[j] << std::endl;
}
 
int main(int argc, char **argv) {

    Fl_Window *G_win = 0;
    G_win = new Fl_Window(300,300,"Test");

    myinput* A;
    // Where you may store the strings
    std::vector<std::string> mytext;

    A = new myinput(100,50,100,20, mytext,"Insert text");

    Fl_Button* add;

    add = new Fl_Button(250,50,25,25,"+");
    add->callback(add_cb,A);


    G_win->end();
    G_win->show(argc, argv);
    
    return Fl::run();
}

如果你想存储来自多个输入字段的字符串,你可以在 Fl_Group 中收集 Fl_input 并将后者传递给按钮的回调。

请注意,我写的代码不是很优雅,也不是最有效的:它只是向您展示我解决问题的想法(如果我理解正确的话)。