所以我目前正在编写一个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。 我很好奇,如果我这样做是正确的,或者是否有更好的方法来实现我将功能分成单独文件的目标。
答案 0 :(得分: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();
答案 1 :(得分:0)
正确的方法是不在ui
类之外使用mainwindow
命名空间和mainwindow
方法。您应该子类QWidget
或任何其他类,您想要扩展哪些功能,创建您需要的所有功能(如doImportantStuff()
)并包含这个新的类标题(让我们称之为myWidget
)在mainwindow.h
。然后你可以在主窗口创建那些myWidget
,将它们添加到ui
(通过disigner添加,添加QWidget,点击提升,选择你的类,或者手动添加到布局)并使用全部他们创建的信号和功能,如:
connect(ui->doWorkButtot(),SIGNAL(clicked()), myWidget, SLOT(doImportantStuff()));`
再次,您可以通过ui
更改为signals and slots mechanism
;在感觉myWidget
时,您必须以某种方式更改ui,emit
发出信号,然后使用mainwindow
在connect
中抓住它。例如:
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()`