うまく分けるのは結構経験がいると思いますが、まずは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への設定だけになるのですっきりすると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。