質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

1534閲覧

iced::TextInput の値を変更できるようにしたい

sutonea

総合スコア207

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2021/09/12 06:56

編集2021/09/15 00:22

実現したいこと

iced::TextInput を用いて
テキストボックスをGUI上に表示し、
文字を入力できるようにしたいです。

環境

  • macOSネイティブアプリとして実行しています
  • iced のバージョンについて

Cargo.toml に記載していなかったっため、
Cargo.lock を確認したところ、0.3.0 でした。

[[package]] name = "iced" version = "0.3.0"

発生している問題

テキストボックスを表示することはできましたが、
クリックしてもフォーカスできず、文字を入力できません。

試したこと

TextInput::new の第3引数に問題があると考え、
以下のパターンを試しましたが、文字入力できない状態のままでした。

  • 文字列リテラル "" を渡す
  • String オブジェクトへの参照を渡す

ソースコード

main.rs

rust

1use iced::{TextInput, text_input, Application, Command, Clipboard, Element, Settings}; 2 3fn main() -> iced::Result { 4 App::run(Settings::default()) 5} 6 7struct App { 8 input_state: text_input::State, 9 text_value: String 10} 11 12impl Application for App { 13 type Executor = iced::executor::Default; 14 type Message = (); 15 type Flags = (); 16 17 fn new(_flags: Self::Flags) -> (Self, Command<Self::Message>) { 18 ( 19 App { 20 input_state: text_input::State::new(), 21 text_value: String::from("") 22 }, 23 Command::none() 24 ) 25 } 26 27 fn title(&self) -> String { 28 String::from("サンプル") 29 } 30 31 fn update(&mut self, _message: Self::Message, _clipboard: &mut Clipboard) -> Command<Self::Message> { 32 Command::none() 33 } 34 35 fn view(&mut self) -> Element<'_, Self::Message> { 36 TextInput::new( 37 &mut self.input_state, 38 "place holder", 39 &mut self.text_value, // String オブジェクトへの参照を渡す 40 |_string| {} 41 ).into() 42 } 43}

Cargo.toml

[package] name = "RustWithCLion" version = "0.1.0" edition = "2018" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] iced = { features = ["async-std", "debug"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] async-std = "1.0" directories-next = "2.0" [target.'cfg(target_arch = "wasm32")'.dependencies] web-sys = { version = "0.3", features = ["Window", "Storage"] } wasm-timer = "0.2" [package.metadata.deb] assets = [ ["target/release/todos", "usr/bin/iced-todos", "755"], ["iced-todos.desktop", "usr/share/applications/", "644"], ]

実行結果

実行結果

バージョン情報

mac OS BigSur 11.5.2 % cargo --version cargo 1.51.0 (43b129a20 2021-03-16) % rustc -V rustc 1.51.0 (2fd73fabe 2021-03-23) % rustup -V rustup 1.23.1 (3df2264a9 2020-11-30) info: This is the version for the rustup toolchain manager, not the rustc compiler. info: The currently active `rustc` version is `rustc 1.51.0 (2fd73fabe 2021-03-23)` % rustup show Default host: x86_64-apple-darwin installed targets for active toolchain -------------------------------------- wasm32-unknown-unknown x86_64-apple-darwin active toolchain ---------------- stable-x86_64-apple-darwin (default) rustc 1.51.0 (2fd73fabe 2021-03-23)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsuya6502

2021/09/12 23:57

こんにちは。環境に依存した問題かもしれないので、アプリの形態について情報を追加してもらえないでしょうか?(質問に追記してください) - macOSネイティブアプリとして実行している または - wasmアプリとしてWebブラウザー上で実行している スクリーンショットの感じではmacOSネイティブアプリのようですが、APIドキュメントを見たところ、TextInput::newはiced_webクレートにしか存在しないようなので、その違い?が少し気になりました。 あと、Cargo.tomlでicedの version = 指定がないようですが、ここも少し変なので確認をお願いします。(指定がないとエラーになるものだと思ってました) 私はicedを試したことはないので、情報があってもすぐに答えはわからないのですが、もし、しばらく回答がつかないようなら、私の方でも調べてみようと思います。
sutonea

2021/09/15 00:28

コメントとご調査ありがとうございます。ご返答遅れましてすみません、情報を追記いたしました。
tatsuya6502

2021/09/15 01:59

情報を追記していただき、ありがとうございました。また、問題の方も解決したということでよかったです。
guest

回答1

0

ベストアンサー

Messageの処理が行われていないからではないでしょうか.

iced::Application::view() は表示用なので, update()の中でメッセージを処理する必要があったかと存じます.

rust

1#[derive(Debug, Clone)] 2enum Message { 3 TextInputChanged(String), 4}

のようなものを定義し, App内の

rust

1type Message = ()

rust

1type Message = Message

とした上で, update()でMessageを処理する実装を記述し,

rust

1fn update(&mut self, message: Self::Message, _clipboard: &mut Clipboard) -> Command<Self::Message> { 2 match message { 3 Message::TextInputChanged(str) => { 4 self.text_value = str; 5 }, 6 _ => {} 7 } 8 Command::none() 9 }

view()内のTextInput::new()の第四引数でMessageを生成するようにすれば入力できるようになるかなと思います.

rust

1fn view(&mut self) -> Element<'_, Self::Message> { 2 TextInput::new( 3 &mut self.input_state, 4 "place holder", 5 &self.text_value, 6 Message::TextInputChanged, 7 ).into() 8 }

投稿2021/09/13 02:10

m13o

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sutonea

2021/09/15 00:29

ご返答遅れましてすみません。そちらの方法で解決いたしました、ありがとございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問