2013-11-04 99 views
1

因此,我目前正在編寫一個Qt應用程序,但對它來說相當新穎,並且不確定應該如何設計某些特定的東西。隨着我添加越來越多的代碼,我的MainWindow.cpp變得越來越大,不羈。我很好奇什麼是將我的代碼分成更小的文件的正確方法。我希望移動到單獨文件的每個組件都在對UI進行更改。我現在正在做的只是創建一個新的.cpp文件,然後包括我的MainWindow和MainWindow UI。這裏是我放置在自己的文件中的一個函數的例子。如何將Qt代碼分解成單獨的部分?

#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」。 我很好奇,如果我這樣做是正確的方式,或者如果有更好的方法來實現我的目標,將功能分成單獨的文件。

回答

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(); 
0

有道WOU ld不要使用ui命名空間和mainwindow類以外的mainwindow類。您應該將子類QWidget或任何其他類(您想要擴展的功能)創建爲您需要的所有功能(如doImportantStuff()),並在mainwindow.h中包含此新類頭(我們稱之爲myWidget)。然後,你可以在主窗口中創建這些myWidget,將它們添加到ui(以太通過disigner,添加QWidget,單擊提升到,選擇你的類,或手動添加到佈局),並使用它們的所有信號和功能,已經創建,如:

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

,改變ui您可以通過signals and slots mechanism做;在myWidget當你覺得,你必須改變UI,emit信號,並在mainwindowconnect捕獲它。例如:

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()`