【问题标题】:C++ Qt Signals and SlotsC++ Qt 信号和槽
【发布时间】:2018-08-31 08:33:41
【问题描述】:

我很难连接到不同类中定义的 SLOT。我有 2 个类 - 计算和 MainWindow。 MainWindow 应该只处理程序的 GUI 部分,而 Computations 处理计算。我正在创建一个计算器。

基本上,我想了解如何从 MainWindow 类连接到 Computations 类中的 SLOT。

【问题讨论】:

标签: c++ qt qt-slot


【解决方案1】:

我猜你已经检查了Qt Signals & Slots page。要实现你想要的,你需要在另一个类中有一个类的实例。

因此,例如在您的 MainWindow 类中,您可以包含 Computations 类并为其创建一个成员变量:

#include "computations.h"

class MainWindow : public QMainWindow
{
   Q_ObBJECT
public:
   //..
private:
   Computations *_computation;
};

然后在初始化_computation 对象(_computation = new Computations();)之后在MainWindow 的构造函数中进行这样的连接(适用于Qt5):

QObject::connect(_computation, &Computations::somethingHappened, this, &MainWindow::doSomeGuiStuff);
QObject::connect(this, &MainWindow::guiThingHappened, _computation, &Computations::doSomeComputation);

取决于它应该走的路。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是另一个版本的使用方法,我觉得对初学者来说更容易理解

    您需要在类中定义信号和槽。 添加到类的标题中,例如向 MainWindow 发出信号,向 Computations 添加槽

    public slots:
        void something();
    
    signals:
        void something_happend();
    

    然后,在您想要使用它的任何地方,在 mainwindow.cpp 中的示例中,您需要连接信号和插槽。通过 QObject::connect 执行此操作:

    QObject::connect(who_emit,SIGNAL(what_signal),who_receive,SLOT(what_slot))
    

    例子:

    mainwindow.h

    signals:
        void something_happend();
    

    computations.h

    public slots:
        void something_happend();
    

    mainwindow.cpp

    Computations *c = new Computations(this);
    QObject::connect(this,SIGNAL(something_happend()),c,SLOT(something()));
    

    如果你想传递一些参数,你想连接的 SIGNAL 和 SLOT 需要有相同类型的参数:

    public slots:
        void something(int c);
    
    signals:
        void something_happend(int c);
    
    QObject::connect(this,SIGNAL(something_happend(int)),c,SLOT(something(int)));
    

    【讨论】:

      【解决方案3】:

      此类连接属于 UI 和控制器(计算对象)都可用的级别。因此,无论是在main 的主体中,还是在构成应用程序各种元素的高层次的类中(不过,这样的类通常不应该派生自QApplication)。

      如果 UI 类知道计算对象的存在,或者以某种方式与其细节相关联,那么耦合几乎总是太紧。我通常将 UI 设计为具有由信号和插槽组成的接口,该接口具有尽可能通用的性质,然后通过信号/插槽连接将其绑定到一个或多个控制器对象。我还利用属性系统以通用方式公开与 UI 相关的属性,通常使用视图模型对象将与 UI 无关的控制器连接到具体类型的 UI。

      在你的情况下,我建议MainWindow 不知道Computations,反之亦然:

      int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
        Computations comp;
        MainWindow ui;
        QObject::connect(&comp, ..., &ui, ...);
        /* more connections here */
        ui.show();
        return app.exec();
      }
      

      更多具体示例,请参阅answer #1answer #2

      【讨论】:

        【解决方案4】:

        您需要插槽和信号,因为它们可以协同工作,如下所示: 你的文件.h

        public slots:
            void start();
        
        signals:
            void levelChanged(int level);
        

        实施:

        void MainBoard::start()
        {
            isStarted = true;
            clearBoard();
            emit levelChanged(1);
        
        }
        

        现在你需要链接一个按钮

        startButton = new QPushButton(tr("&Start"));
        startButton->setFocusPolicy(Qt::NoFocus);
        
        connect(startButton, &QPushButton::clicked, board, &MainBoard::start);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          相关资源
          最近更新 更多