2013-07-30 47 views
0

有人可以帮助解决如何在没有用户输入的情况下更新gui窗口的困惑。如何在C++代码创建后更新gtkmm gui屏幕

换句话说,我希望能够输出文本到任一个或两个控制台我们的gui窗口。

目前我可以调用GUI窗口(例如带有标签的窗口)并输出初始文本。但是,该过程在窗口关闭之前不会返回到我的C++代码。我试图弄清楚如何(或在哪里有我的代码)在GUI窗口退出之前更新GUI屏幕。

这是一个例子:

#include <gtkmm.h> 
#include <iostream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    Gtk::Main kit(argc, argv); 

    Gtk::Window window; 
    Gtk::TextView textview; 
    Gtk::Label label; 

    string mylabeltext = "This is the first line of text in my gui window.\n"; 

    window.set_default_size(600, 360); 
    window.set_title("Gtkmm Programming - C++"); 
    window.set_position(Gtk::WIN_POS_CENTER); 

    label.show(); 
    window.add(label); 

    label.set_text(mylabeltext); 

    mylabeltext += "About to run some routines...\n"; 

    label.set_text(mylabeltext); 

    cout << "An initial line has been set to the gui window." << endl; 
    // The Gui Window is displayed 
    Gtk::Main::run(window); 
    // Now my main program has performed some functions and wants to update 
    // the console and the gui window. 
    cout << "Continuing after various functions and processing..." << endl; 
    mylabeltext = "Showing the results of the functions and processing."; 
    label.set_text(mylabeltext); 

    return 0; 
} 

文本的最后一行,直到GUI退出从未打印到控制台。 mylabeltext的最后一行从不打印到标签窗口。

我想要描述的是如何在我的C++代码中运行其他例程并将输出更新为控制台和gui窗口而不关闭GUI窗口以继续C++例程的同时保持gtkmm窗口处于活动状态。

我可以找到的所有示例都使用代码中的按钮。我已经测试和足够的实验了,我可以在按下按钮后更新GUI屏幕。但是,我不想依靠用户进行屏幕更新。我希望能够运行光盘扫描和其他功能,并定期更新屏幕,以便用户可以看到进度并知道该程序仍在工作而不是死机。

一些,我已经在我的尝试是了解该研究的资源包括:

+0

使用定时器或闲置。 – tp1

+0

我不明白你对计时器的意思。但是,如果我在运行sleep()函数之后尝试附加新文本,则每个sleep()函数之后都不会出现窗口。如果我在窗口显示后添加sleep()函数,窗口将保持显示,并且sleep()函数将永远不会执行,直到gui窗口退出。 –

回答

0

像TP1他们对您的问题评论说: ,计时器将是最简单的方法来做到这一点。

要设置一个1.5秒的超时,将调用另一个函数,这样做(的gtkmm 3):

#include <gtkmm.h> 
#include <iostream> 

using namespace std; 

class MyApp : public Gtk::Window{ 
public: 
    Gtk::Label label; 
    bool on_timeout(); //return true to keep the timeout and false to end it 
    MyApp(); 
    virtual ~MyApp(); 
}; 

MyApp::MyApp(){ 
string mylabeltext = "This is the first line of text in my gui window.\n"; 

set_default_size(600, 360); 
set_title("Gtkmm Programming - C++"); 
set_position(Gtk::WIN_POS_CENTER); 

add(label); 

label.set_text(mylabeltext); 

mylabeltext += "About to run some routines...\n"; 

label.set_text(mylabeltext); 

cout << "An initial line has been set to the gui window." << endl; 

//create slot for timeout signal 
int timeout_value = 1500; //in ms (1.5 sec) 
sigc::slot<bool>my_slot = sigc::mem_fun(*this, &MyApp::on_timeout); 
//connect slot to signal 
Glib::signal_timeout().connect(my_slot, timeout_value); 
show_all_children(); 
} 

MyApp::~MyApp(){ 

} 

bool MyApp::on_timeout(){ 
cout << "Continuing after various functions and processing..." << endl; 
string temp = label.get_text(); 
temp += "Showing the results of the functions and processing.\n"; 
label.set_text(temp); 
return true; 
} 

int main(int argc, char* argv[]) 
{ 
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "com.kaze.test"); 

MyApp myapp; 

// The Gui Window is displayed 
return app->run(myapp); 
} 

此处了解详情:https://developer.gnome.org/gtkmm-tutorial/3.3/sec-timeouts.html.en

+0

谢谢,Senshikaze。这是一个开始。我相信有一些东西缺失(很可能以我幼稚的方式描述目标)。 这将放置一个无限循环,其中“继续执行各种功能...”“可能是因为我不懂如何使用”myapp“类,我将它放在主(Gtk :: Main :: run(myapp);)中,替换run(window )with run(myapp) 这是我的目标,是通过代码到最后一行,在屏幕上留下最后一行输出,等待用户读完后退出gui。 –

+0

具体做什么你想在timeout函数中返回false(on_timeout)。MyApp类是一个我构建的继承Gtk :: Window类的类。 – senshikaze

+0

我用return false替换了return true。它似乎工作。但是,(I我确定这是一个我更了解代码的问题,我正在研究这个代码,但是我仍然处于一个不同的地方,我增加了30秒的睡眠时间(以表示其他活动将会产生新的输出,然后添加行:temp + =“一个结果nother函数“。并试图用label.set_text(temp)将它添加到屏幕上。 gui窗口在30秒内褪色,然后立即打印。我试图根据每个步骤的输出在屏幕上保留所有文本。 –

0

这是粗糙,但这个功能对我试图做:

#include <gtkmm.h> 
#include <iostream> 

using namespace std; 

class myLabel: public Gtk::Window 
{ 
public: 
    myLabel(); 
    virtual ~myLabel(); 

protected: 
    Gtk::Label m_label; 
    string labeltext; 
    string newtext; 
    void myprocess1(); 
}; 

myLabel::myLabel() : 
     m_label() 
{ 
    void myprocess1(); 

    set_title("Gtkmm Programming - C++"); 
    add(m_label); 

    m_label.show(); 

    Glib::Thread::create(sigc::mem_fun(*this, &myLabel::myprocess1), true); 
} 

myLabel::~myLabel() 
{ 
} 

void myLabel::myprocess1() 
{ 
    labeltext = "About to preform a number of processes.\n"; 
    labeltext += "Each process may take up to three hours.\n"; 
    labeltext += "Please carry your daily chores and wait.\n"; 
    cout << labeltext; 
    cout.flush(); 
    m_label.set_text(labeltext); 

    sleep(10); // Back from a three hour function 
    newtext = "Back from a three hour function\n"; 
    labeltext += newtext; 
    m_label.set_text(labeltext); 
    cout << newtext; 
    cout.flush(); 

    sleep(10); // Back from a three hour function 
    newtext = "Back from another three hour function\n"; 
    labeltext += newtext; 
    m_label.set_text(labeltext); 
    cout << newtext; 
    cout.flush(); 

    newtext = "Exiting in 1 minute...\n"; 
    labeltext += newtext; 
    m_label.set_text(labeltext); 
    cout << newtext; 
    cout.flush(); 
    sleep(60); 
    exit(0); 
} 

int main(int argc, char* argv[]) 
{ 
    if (Glib::thread_supported()) 
     Glib::thread_init(); 
    else 
    { 
     cerr << "Threads aren't supported!" << endl; 
     exit(1); 
    } 

    Gtk::Main kit(argc, argv); 

    myLabel mylabel; 
    Gtk::Main::run(mylabel); 
    return 0; 
} 

希望的例子可以帮助其他人想要输出与更新,类似于更新信息到控制台gtkmm的GUI。