我有一个小的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(>k_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(>k_box)
.default_height(720)
.default_width(360)
.build();
window.present();
}
编辑
由于GString
实现了Display
,下面的工作也同样有效:
println!("{}", input.text());