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

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

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

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2327閲覧

Qtでウィンドウクラス以外のクラスからUIへのアクセス

siguma0013

総合スコア9

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/03/07 15:21

Qtをサンプルなどを参考にしながら勉強中のものです。
C++もしっかり扱えているとは言えない状態です。

サンプルによくある、main.cpp , mainwindow.h , mainwindow.cpp , interface.ui のような構成で色々触ってみています。
現在はmainwindow.cppに処理を足していっている状態なのですが、処理が増えいき他のソースファイルに処理を書いた場合どのようにUIにアクセスすればいいのかわからず困っています。

具体的な回答、勉強不足なので勉強の指針になるような回答でもいただけたら嬉しいです。

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

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

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

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

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

guest

回答2

0

一度に色々と言っても消化できないと思いますのでひとつだけ言いますと、
「他のソースファイルに処理を書いた場合どのようにUIにアクセスするのか」というのは発想が逆であり、
UIにアクセスする処理を mainwindow に書き、アクセスしない処理を他のソースに書くというのが正しいです。

それ以上のことは、設計の勉強をしなければいけないのですが、私自身いろいろな試行錯誤や沢山の本を読みあさって勉強したので、「これだけあればOK」というようなやり方とか本を紹介するのは難しいです。
ひとつだけ言えるのは、自分自身で必要だとか楽しいと思わないことは、どんなに勉強しても身につかないということです。まずは色々やってみることです。

投稿2018/03/08 13:09

yuki23

総合スコア1448

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

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

0

ベストアンサー

うまく分けるのは結構経験がいると思いますが、まずはMainWindowの中はできるだけUIからイベントを受けるのとUIの更新処理だけにして、値の更新部分を別クラスに分離し、値が変化したらMainWindowにシグナルで通知するのがいいかと思います。

以下は、ウィンドウ上にQPushButton(button)とQLabel(label)が1つあって、ボタンを押すたびにラベルの値が1つ増えていくような例です。
(今すぐ動作を試せる環境がなかったので、大体こんな感じ、で見てください)

C++

1class Counter : public QObject 2{ 3 Q_OBJECT 4public: 5 Counter(QObject* parent) : QObject(parent), m_value(0) {} 6 7 void increment() 8 { 9 ++m_value; 10 emit valueChanged(); 11 } 12 int value() const { return m_value; } 13signals: 14 void valueChanged(); 15private: 16 int m_value; 17}; 18 19class MainWindow : public QMainWindow 20{ 21 Q_OBJECT 22public: 23 MainWindow() : 24 ui(new Ui::MainWindow()), 25 m_counter(new Counter(this)) 26 { 27 ui->setupUi(this); 28 29 onValueChanged(); 30 connect(m_counter, &Counter::valueChanged, 31 this, &MainWindow::onValueChanged); 32 } 33 34 void on_button_clicked() 35 { 36 m_counter->increment(); 37 } 38 39private slots: 40 void onValueChanged() 41 { 42 ui->label->setText(QString::number(m_counter->value())); 43 } 44 45private: 46 Ui::MainWindow* ui; 47 Counter* m_counter; 48}; 49

このように値の更新部分をクラスに分離して変化をシグナルで通知してやれば、
MainWindowはUIのイベントからの更新の呼び出しと、変化があった場合のUIへの設定だけになるのですっきりすると思います。

投稿2018/03/08 12:46

toki_td

総合スコア2850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問