# QAFrame **コントロール機能**:質問と回答のインタラクティブなフレームワークを実装。WebSocketを通じて授業コンテンツ(音声・動画、画像、Markdownなど)、問題情報および結果フィードバックを受信可能。テキストまたは音声による回答の提出も可能。オンライン授業やクイズ等のシーンに適用。 **タイプ**:コンテナーコントロール **親クラス**:`bricks.VBox` ## 初期化パラメータ | パラメータ名 | 型 | 説明 | |--------------|----|------| | `ws_url` | String | WebSocket接続アドレス。バックエンドとの通信に使用 | | `ws_params` | Object (オプション) | `ws_url`に付加するクエリパラメータオブジェクト。URLクエリ文字列に変換される | | `title` | String (オプション) | ページタイトル(コード内で直接使用されていない可能性あり。外部から渡される) | | `description` | String (オプション) | 説明文 | | `courseware` | Object (オプション) | 初期の教材リソース設定。以下の内容を含む:
- `type`: `\"audio\"`, `\"video\"`, `\"image\"`, `\"markdown\"`
- `url`: リソースのURL
- `timeout`: 再生タイムアウト時間(秒)。0はタイムアウトなしを意味 | | `timeout` | Number | 全体のタイムアウト制御(秒単位)。0はタイムアウトなし | > 注:初期化時に内部サブコントロールとして `top_w`(HBox)、`main_w`(Filler)、`bottom_w`(HBox)が作成され、WebSocket接続が確立される。 ## 主なイベント | イベント名 | 発火条件 | データ形式の説明 | |-----------|---------|------------------| | `onopen` | WebSocket接続がオープンしたとき | 自動的に `start_question_answer()` メソッドが呼び出され、起動メッセージ `{ type: 'qa_start', data: { d: 'test data', v: 100 } }` を送信 | | `onquestion` | 問題データを受信したとき | データ構造:
`{ q_desc: 問題の説明, total_q: 総問題数, cur_q: 現在の問題番号 }`
`show_question(d)` を呼び出して問題を表示 | | `oncourseware` | 教材リソースデータを受信したとき | データ構造:
`{ type: \"audio\"/\"video\"/\"image\"/\"markdown\", url: リソースリンク }`
`show_courseware(d)` を呼び出して対応するメディアコンテンツを表示 | | `onaskstart` | サーバー側が開始確認を要求したとき | 「Start ?」ボタンを表示。クリックすると `start_question_answer()` を呼び出し、起動信号を送信 | | `click`(カスタムボタン) | ユーザーが「press to start」または「Start ?」ボタンをクリックしたとき | `conform_start()` を呼び出し、サーバーに `{ type: 'conform_start', data: null }` メッセージを送信 | ### 受信するデータ型(サーバー側から) 1. **courseware**:指定されたタイプの教材コンテンツを再生 ```json { "type": "courseware", "data": { "type": "audio|video|image|markdown", "url": "リソースURL" } } ``` 2. **askready**:準備完了の確認を求める ```json { "type": "askready", "data": { "total_q": 5, "cur_q": 1 } } ``` 3. **question**:問題を配信 ```json { "type": "question", "data": { "q_desc": "問題のHTMLまたはMDテキスト", "total_q": 5, "cur_q": 1 } } ``` 4. **result**:回答結果の統計を返す ```json { "type": "result", "data": { "total_q": 5, "correct_cnt": 3, "error_cnt": 2 } } ``` 5. **error_list**:エラー詳細リスト ```json { "type": "error_list", "data": { "error_cnt": 2, "rows": [ { "pos": 1, "q_desc": "第1問の問題文", "your_a": "あなたの回答", "corrent_a": "正しい回答", "error_desc": "エラー理由の説明" } ] } } ``` ### 送信するメッセージ型(クライアント → サーバー) 1. **qa_start**:接続成功後に自動送信。処理開始可能であることを示す ```json { "type": "qa_start", "data": { "d": "test data", "v": 100 } } ``` 2. **conform_start**:ユーザーが開始ボタンをクリック後に送信 ```json { "type": "conform_start", "data": null } ``` 3. **text_answer**:テキスト回答を提出 ```json { "type": "text_answer", "data": "ユーザー入力内容" } ``` 4. **audio_answer**:録音回答を提出(Base64エンコード) ```json { "type": "audio_answer", "data": "base64音声文字列" } ``` > すべてのメッセージは内部の `WebSocket` インスタンスを通じて送信され、`this.ws.send(message)` を使用。