You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:24:07