我使用glade创建了一个简单的图形用户界面,包括一个窗口、输入框、标签和一个按钮,并在我的rust项目的src目录中保存为example.glade。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow">
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkFixed" id="windows1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">182</property>
<property name="y">146</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="box1">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="x">68</property>
<property name="y">45</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="x">321</property>
<property name="y">44</property>
</packing>
</child>
</object>
</child>
</object>
</interface>我的目标是创建一个简单的rust应用程序,当在输入框中输入值并通过单击按钮提交时,它会更改标签名称。
我试着用gtk-rs v0.9.2中的this example编写了一个rust后端。这是我的代码
use gtk::glib;
use gtk::prelude::*;
use gtk::{ApplicationWindow, Builder, Button, MessageDialog};
use std::env::args;
fn build_ui(application: >k::Application) {
let glade_src = include_str!("example.glade");
let builder = Builder::from_string(glade_src);
let window: ApplicationWindow = builder.get_object("window1").expect("Couldn't get window1");
window.show_all();
}
fn main() {
let application = gtk::Application::new(
Some("com.github.gtk-rs.examples.builder_basics"),
Default::default(),
)
.expect("Initialization failed...");
application.connect_activate(build_ui);
application.run(&args().collect::<Vec<_>>());
}当我运行这个命令时,我得到下面的错误
error: extern crate `glib` is private, and cannot be re-exported (error E0365), consider declaring with `pub`
--> src/main.rs:1:5
|
1 | use gtk::glib;
error[E0599]: no method named `connect_activate` found for struct `Application` in the current scope
--> src/main.rs:23:17
|
23 | application.connect_activate(build_ui);
| ^^^^^^^^^^^^^^^^ method not found in `Application`
error[E0599]: no method named `run` found for struct `Application` in the current scope
--> src/main.rs:25:17
|
25 | application.run(&args().collect::<Vec<_>>());
| ^^^ method not found in `Application`我们如何使用glade、gtk-rs在rust中构建GUI?
#Cargo.toml
[dependencies]
gtk = "0.9.2"发布于 2021-05-09 06:30:57
我不能说这是做这件事的聪明/正确的方法,但看看你的错误。
glib是它自己的依赖项,所以在你的cargo.toml中添加它。我认为你至少需要:
[dependancies]
gio = {version = "*", features =["v2_44"]}
glib = "*"
gtk = {version = "*", features =["v3_16"]}
gdk = "*"其中一些功能是我的程序特别需要的。
我有如下的use语句:
// imports for GTK UI windows
use gio::prelude::*;
use gtk::prelude::*;
use glib;
use gtk::{Button} // as an example widget前奏应该有助于弥补连接和运行等功能的缺失。
我的主要跑步方式是这样的,与你的相似但不相同:
// gtk UI setup an run
let application =
gtk::Application::new(Some("Program name"), Default::default())
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&args().collect::<Vec<_>>());发布于 2021-04-11 11:51:28
在缺乏好的文档、教程或帮助的情况下,很难在生锈的环境中编程。我不得不梳理了许多网站,复制并编辑了许多示例代码,才能让它正常工作。首先,我们必须在cargo.toml文件中指定一个版本,该版本必须是我们安装的gtk3,gio版本。现在,我的依赖项看起来像这样。
[dependencies]
glib = "0.10.3"
[dependencies.gtk]
version = "0.9.2"
features = ["v3_XX"] // XX our gtk3 sub version
[dependencies.gio]
version = "0.9.1"
features = ["v2_XX"] // XX our gio sub version然后,我编辑了glade文件,用处理程序_on_clicked设置了一个信号事件
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkFixed">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="_on_clicked" swapped="no"/>
</object>
<packing>
<property name="x">182</property>
<property name="y">146</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="box1">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="x">68</property>
<property name="y">45</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="x">321</property>
<property name="y">44</property>
</packing>
</child>
</object>
</child>
</object>
</interface>这是我在rust中的对应逻辑
extern crate gtk;
extern crate gio;
use gtk::prelude::*;
use gio::prelude::*;
use gtk::{Builder,Window, Button};
use std::env::args;
// the handler
fn on_clicked(param: &[glib::Value]) -> Option<glib::Value> {
println!("on_start_clicked fired!");
None
}
fn build_ui(application: >k::Application) {
let glade_src = include_str!("example.glade");
let builder = Builder::from_string(glade_src);
let window: Window = builder.get_object("window1").expect("Couldn't get window");
window.set_application(Some(application));
window.set_title("Test");
window.connect_delete_event(|_, _| {
gtk::main_quit();
Inhibit(true)
});
// directly calling the button1 without implementing signal
//let btn: Button = builder.get_object("button1").expect("Cant get button");
//btn.connect_clicked(|_| {
//println!("Activated");
//});
builder.connect_signals(|builder, handler_name| {
match handler_name {
// handler_name as defined in the glade file => handler function as defined above
"_on_clicked" => Box::new(on_clicked),
_ => Box::new(|_| {None})
}
});
window.show_all();
}
fn main() {
let application = gtk::Application::new(
Some("com.test.app"),
Default::default(),
)
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&args().collect::<Vec<_>>());
}https://stackoverflow.com/questions/66942543
复制相似问题