【发布时间】:2021-03-11 18:56:15
【问题描述】:
我想用 gtkmm/glade 制作一个有用的应用程序,我需要将一个简单的按钮信号传递给另一个线程。但不幸的是,我不知道该怎么做。为了更好的演示,我做了一个小软件。这是一个按钮和一个进度条,如果您按下该按钮,进度条就会被填满。如果您修改我的代码以使“ClickInterrupt()”函数在另一个线程中工作,那就太好了。
干杯!
cpp 文件:
#include <iostream>
#include <gtkmm.h>
using namespace std;
Glib::RefPtr<Gtk::ProgressBar> MyProgressBar;
void ClickInterrupt (void)
{
static float value;
value += 0.2;
if (value > 1.0) value = 0.0;
MyProgressBar->set_fraction (value);
cout << "how do I run this in another thread?" << endl;
}
int main (int argc,char* argv[])
{
auto app = Gtk::Application::create(argc, argv, "org.mylittleapp.uwu");
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("mygui.glade");
auto MainWindow = Glib::RefPtr<Gtk::ApplicationWindow>::cast_dynamic(builder->get_object("ApplicationMain"));
auto MyButton = Glib::RefPtr<Gtk::Button>::cast_dynamic(builder -> get_object("MyButton"));
MyButton -> signal_clicked().connect(sigc::ptr_fun(&ClickInterrupt));
MyProgressBar = Glib::RefPtr<Gtk::ProgressBar>::cast_dynamic(builder->get_object("Progress"));
app->run(*(MainWindow.get()));
}
林间空地文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkApplicationWindow" id="ApplicationMain">
<property name="can-focus">False</property>
<property name="title" translatable="yes">N00B :)</property>
<property name="default-width">200</property>
<property name="default-height">100</property>
<property name="icon-name">face-smile-big</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkProgressBar" id="Progress">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">center</property>
<property name="vexpand">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="MyButton">
<property name="label" translatable="yes">Fill the Progressbar</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">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
【问题讨论】:
-
可以this帮忙吗?
-
是的,很有帮助。但我想确定一下,请编辑我的代码。
-
我在下面发布了文档。很遗憾,如果您没有研究可显示(例如:试用代码、具体问题等),我无法为您提供帮助。
标签: c++ linux gtkmm glade gtkmm3