如何从小部件获取ui以便在另一个类中连接它?

时间:2015-12-30 16:54:28

标签: c++ qt

我需要将一个QPushButton(startListeningPushButton)从我的StartWindow连接到我的MainController中的一个插槽。我还有几个问题:

  1. 我应该指针Ui::startWidget ui,因为默认情况下Qt将其创建为普通变量吗?

  2. getStartWindow()是从StartWindow获取ViewController的正确方法吗?

  3. startListeningPushButton获取StartWindow的正确方法是什么(我的选择权是正确的)?

  4. 这是我的代码:

    MainController.cpp:

    MainController::MainController()
    {
        connect(m_viewController.getStartWindow()->getStartListeningPushButton, &QPushButton::clicked, this, &MainController::bla)
    
    }
    

    ViewController.cpp:

    StartWindow* ViewController::getStartWindow()
    {
        return &startWindow;
    }
    

    StartWindow.cpp:

    QPushButton* StartWindow::getStartListeningPushButton()
    {
        return ui->fStartListeningPushButton;
    }
    

    StartWindow.h:

    #ifndef STARTWINDOW_H
    #define STARTWINDOW_H
    
    #include "ui_startwindow.h"
    
    class StartWindow : public QWidget
    {
        Q_OBJECT
    public:
        StartWindow(QWidget *parent = 0);
        ~StartWindow();
        QPushButton* getStartListeningPushButton();
    
    private:
        Ui::startWidget *ui;
    };
    
    #endif // STARTWINDOW_H
    

2 个答案:

答案 0 :(得分:1)

目前还不清楚你是否有,然后你的问题是什么。

我怀疑唯一可行的是您调用connect的第一个参数:

m_viewController.getStartWindow()->getStartListeningPushButton实际应该是m_viewController.getStartWindow()->getStartListeningPushButton()(要调用该函数,以便获得指向期望QPushButton的指针并将其传递给connect函数。 / p>

connect函数中:

  • 第一个和第三个参数必须是QObject*类型。所以这可以是this指针(如果当前类是从QObject派生的),或者类型为QObject*ui->fStartListeningPushButton)的任何类属性,或者是函数调用返回{{ 1}}(QObject*)。但m_viewController.getStartWindow()->getStartListeningPushButton()(没有m_viewController.getStartWindow()->getStartListeningPushButton)在这里没有意义。)
  • 第二个参数必须是()(使用signal关键字在头文件类中声明。您不需要在此处实现任何代码,您只需声明信号并且Qt MOC机制实现它默默)。此参数的有效语法为signals:&QPushButton::clicked(Qt4语法,在Qt5中仍然有效)。
  • 第四个参数必须是SIGNAL(clicked())(使用slot关键字在头文件类中声明,并由您实现)。此参数的有效语法为slots:&MainController::bla(Qt4语法,在Qt5中仍然有效)。
  • 当您开始处理线程时,实际上是第五个可选参数。

答案 1 :(得分:1)

  1. 如果你正在使用Qt Designer和Qt IDE生成这样的代码,它的对象不是指针,我不认为你应该把它作为指针。

  2. 是的,返回指向QWidget的指针(在你的情况下是StartWindow)是可以的。

  3. 你的吸气器没问题。
  4. 好像你的连接中有错误类型,它应该是这样的:

    QObject::connect(m_viewController.getStartWindow()->getStartListeningPushButton(), SIGNAL(clicked()),
                     this, SLOT(bla()));