Gtkmm 3.24中如何从Glade文件获取Gtk::ProgressBar并设置其fraction值?
在Gtkmm 3.24中从Glade加载进度条并实现按钮点击更新
你遇到的问题我太熟悉了——Glade拖放控件很轻松,但要把它们和代码逻辑连起来就得动动手。下面我一步步教你搞定点击按钮更新进度条的功能:
核心思路
要实现这个需求,我们只需要完成三件事:
- 在
MainWindow类中持有进度条的引用,方便后续操作 - 把按钮的点击信号绑定到自定义的回调函数上
- 在回调函数里更新进度条的显示比例
修改你的main.cpp文件
我已经帮你调整好了代码,关键改动都加了注释,方便你理解:
#include <memory> #include <gtkmm.h> class MainWindow : public Gtk::ApplicationWindow { public: MainWindow(BaseObjectType* obj, Glib::RefPtr<Gtk::Builder> const& builder) : Gtk::ApplicationWindow(obj), builder{builder}, progress_value{0.0} { // 从Glade文件中获取进度条对象,绑定到类成员变量 builder->get_widget("MyProgressBar", progress_bar); // 获取按钮对象,并绑定点击信号到自定义回调函数 Gtk::Button* little_button = nullptr; builder->get_widget("LittleButton", little_button); if (little_button) { little_button->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_button_clicked)); } } virtual ~MainWindow() = default; private: Glib::RefPtr<Gtk::Builder> builder; Gtk::ProgressBar* progress_bar; // 存储进度条对象的成员变量 double progress_value; // 记录当前进度的数值 // 按钮点击事件的回调函数 void on_button_clicked() { // 每次点击增加0.1的进度,超过1.0就重置为0 progress_value += 0.1; if (progress_value > 1.0) { progress_value = 0.0; } // 更新进度条的显示比例 if (progress_bar) { progress_bar->set_fraction(progress_value); } } }; int main(int argc, char* argv[]) { auto app = Gtk::Application::create(argc, argv, "de.engelmarkus.example"); auto builder = Gtk::Builder::create_from_file("MyGladeGUI.glade"); MainWindow* mwindow = nullptr; builder->get_widget_derived("MainWindow", mwindow); auto r = app->run(*mwindow); delete mwindow; return r; }
关键改动说明
- 新增
Gtk::ProgressBar* progress_bar成员变量,用来保存从Glade加载的进度条实例,这里的MyProgressBar要和你Glade文件里进度条的ID完全对应 - 在构造函数中获取按钮对象,并通过
signal_clicked().connect()将点击事件和on_button_clicked函数绑定 - 回调函数里维护一个
progress_value变量,每次点击增加0.1的进度,超过1就重置,最后调用set_fraction()更新进度条的显示
你的Glade文件无需修改
你原来的Glade文件完全没问题,进度条的IDMyProgressBar已经和代码里的引用对应上了:
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.24"/> <object class="GtkApplicationWindow" id="MainWindow"> <property name="can-focus">False</property> <property name="title" translatable="yes">My Main Window</property> <property name="default-width">200</property> <property name="default-height">150</property> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkButton" id="LittleButton"> <property name="label" translatable="yes">button</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">True</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkProgressBar" id="MyProgressBar"> <property name="visible">True</property> <property name="can-focus">False</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">2</property> </packing> </child> </object> </child> </object> </interface>
编译运行
还是用你原来的编译命令即可:
g++ -rdynamic main.cpp -o hello $(pkg-config gtkmm-3.0 --libs --cflags)
运行./hello后,点击按钮就能看到进度条一步步前进,满了之后会自动重置啦!
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

