1

だから私は現在Qtアプリを書いていますが、かなり新しく、特定のものをどのように設計すべきかわかりません。コードを追加するにつれて、コードMainWindow.cppが大きくなり手に負えなくなります。コードを小さなファイルに分割する適切な方法は何か知りたいです。別のファイルに移動したい各コンポーネントは、UI に変更を加えています。私が現在行っていることは、文字通り新しい .cpp ファイルを作成し、MainWindow と MainWindow ui を含めることです。これは、独自のファイルに配置した関数の例です。

#include <QDebug>
#include <QString>
#include <QPalette>
#include "master_main_window.h"
#include "ui_master_main_window.h"
#include "cmd_net.h"
#include "cmd.h"


/*
 * Send a command/data packet to the host
 */
void MasterMainWindow::sendCommand() {

    // Disable some GUI components
    ui->con_btn_cmd_disc->setEnabled(false);
    ui->con_btn_cmd_rec->setEnabled(false);
    ui->cmd_edit->setEnabled(false);
    ui->cmd_btn_send->setEnabled(false);

    // Send the packet through the open socket
    sendCmdPacket(ui->cmd_edit->text().toLocal8Bit().data(), cmdSocket);

    // Enable the socket notifier
    cmdSockNotifier->setEnabled(true);

    qDebug() << "Command sent:"
             << (ui->cmd_edit->text().toLocal8Bit().data())
             << "\nSent Packet";
}

ご覧のとおり、"master_main_window.h" と "ui_master_main_window.h" をインクルードしただけで、MainWindow クラスで使用できるさまざまな関数/変数/UI のすべてにアクセスできます。これを適切な方法で行っているのか、それとも関数を個別のファイルに分割するという目標を達成するためのより良い方法があるのか​​ 、興味があります。

4

2 に答える 2

2

あなたが求めていることを正しく理解している場合は、ここでポインターを使用しているため、別のファイルに他のクラスを記述して変数を渡すことができますui。たとえば、ui次の変数があるとします。

QWidget * leftWidget;
QWidget * centerWidget;
QWidget * rightWidget;

QWidget次のように、これらの変数を継承して与えるクラスを作成できます。

class leftWidgetClass : public QWidget
{
  //your code here
}

など...そして、あなたのコンストラクターでMainWindowこれを行うことができます:

leftWidget = new leftWidgetClass();
rightWidget = new rightWidgetClass();
centerWidget = new centerWidgetClass();
于 2013-11-04T05:22:08.873 に答える
0

適切な方法は、クラス外でui名前空間とメソッドを使用しないことです。拡張したい機能のサブクラスまたはその他のクラスを作成し、必要なすべての機能 ( など) を作成し、この新しいクラス ヘッダー ( と呼びましょう) を に含める必要があります。次に、それらをメインウィンドウで作成し、それらをに追加し(デザイナーを介してイーサを追加し、QWidgetを追加し、プロモートをクリックし、クラスを選択するか、手動でレイアウトに追加して)、作成したすべての信号と機能を使用できます、 お気に入り:mainwindowmainwindowQWidgetdoImportantStuff()myWidgetmainwindow.hmyWidgetui

connect(ui->doWorkButtot(),SIGNAL(clicked()), myWidget, SLOT(doImportantStuff()));`

繰り返しますが、変更は;ui経由で行うことができます。と感じたときは、どうにかUIを変えsignals and slots mechanismてシグナルでキャッチしなければなりません。例:myWidgetemitmainwindowconnect

myWidget.h:

...
signals:
void needUiChange();
....
public slots:
myWidget::doImportantStuff(){

....

emit needUiChange();
//  you can emit signals with params also:
//  emit setToolTipText(QString("from signal));
...

メインウィンドウでは、接続を使用してシグナルをキャッチします。

connect(myWidget, SIGNAL(needUiChange(),this,SLOT(updateUI());
// actually you can connect directly to let's say `pushButton`'s slot `hide()`
于 2013-11-04T10:30:20.427 に答える