GTK-rs从GTK::Entry获取输入



我有一个小的gtk-rs应用程序,我试图显示一个输入字段,并从用户获得输入。目前,当用户单击按钮时,我无法从输入字段获取输入。我知道button.connect_clicked是我需要做的,但我不知道怎么做?

My build_ui方法:

use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button, Orientation};
pub fn build_ui(app: &Application) {
let button = Button::builder()
.label("Submit")
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
let input = gtk::Entry::builder()
.placeholder_text("input")
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
let gtk_box = gtk::Box::builder()
.orientation(Orientation::Vertical)
.build();
gtk_box.append(&input);
gtk_box.append(&button);
button.connect_clicked(move | _button| {
println!("{}", input.display()); 
});
let window = ApplicationWindow::builder()
.application(app)
.title("gtk-app")
.child(&gtk_box)
.default_height(720)
.default_width(360)
.build();
window.present();
}

main.rs:

const APP_ID: &str = "org.my-gtk-app";
fn main() {
// Create a new application
let app = Application::builder().application_id(APP_ID).build();
// Connect to "activate" signal of `app`
app.connect_activate(home::build_ui);
// Run the application
app.run();
}

我发现这个问题几乎完全相同,但是当我尝试实现解决方案时,所有的。add方法都会抛出错误声明:

the following trait bounds were not satisfied: `ApplicationWindow: IsA<CellArea>` which is required by `ApplicationWindow: gtk4::prelude::CellAreaExt`

编辑:根据编译器,Gtk::Entry也没有.get_text()方法。在做了更多的谷歌搜索之后,似乎GTK3为Gtk::Entry提供了get_text方法,但Gtk4没有。

那么有没有人知道如何从Gtk::Entry对象中获取文本时使用Gtk4?

编辑2:我想我需要使用.display()方法,但是当我现在运行代码时,我没有从用户那里得到文本输入。input.display()只是返回一个空字符串。我已经更新了代码示例以反映这些更改。

Entry确实有一个text()方法,它给你一个GString(因为Entry实现了Editable),可以使用as_str()转换为ruststr

因此,为了从条目中获取当前文本,可以执行以下操作:
let my_input_value = my_input.text().as_str();

为了完整,下面是更新后的build_ui函数:

pub fn build_ui(app: &Application) {
let button = Button::builder()
.label("Submit")
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
let input = gtk::Entry::builder()
.placeholder_text("input")
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
let gtk_box = gtk::Box::builder()
.orientation(Orientation::Vertical)
.build();
gtk_box.append(&input);
gtk_box.append(&button);
button.connect_clicked(move | _button| {
println!("{}", input.text().as_str()); 
});
let window = ApplicationWindow::builder()
.application(app)
.title("gtk-app")
.child(&gtk_box)
.default_height(720)
.default_width(360)
.build();
window.present();
}

编辑

由于GString实现了Display,下面的工作也同样有效:

println!("{}", input.text());

相关内容

  • 没有找到相关文章

最新更新