使用自动生成的Ui为qt发送器和接收器

时间:2017-05-24 15:06:55

标签: c++ qt qt5 qt-designer

我需要在ui显示后调用一个方法,所以我想连接 框架本身,特别是使用显示信号。 我已经创建了一个由qtcreator自动生成代码的新表单。这是自动生成的标题。

predictOnValues

在cpp文件中,以下任何一个代码都不起作用

#define STARTWINDOW_H
#include <QMainWindow>

namespace Ui {
class StartWindow;
}

class StartWindow : public QMainWindow
{
Q_OBJECT

public:
explicit StartWindow(QWidget *parent = 0);
~StartWindow();

private:
Ui::StartWindow *ui;

public slots:
void doSomething();
};

#endif // STARTWINDOW_H

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

这里有一些问题:

  1. 没有show()信号和
  2. 即使有,也没有正确使用连接。
  3. 首先,如果您的课程定义如下:

    namespace Ui { class MainWindow; }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    signals:
        void someSignal();
    
    public slots:
        void doSomething() {}
    
    private:
        Ui::MainWindow *ui;
    };
    

    在构造函数中对connect的适当调用将是:
    QWidget::connect(this, SIGNAL(someSignal()), this, SLOT(doSomething()));

    即使有显示信号,你也不会从ui获得它,你会从this得到它。 UI类只是通过设计器添加的小部件的哑容器。

    要在显示课程时执行某些操作,您可以覆盖
     virtual void showEvent(QShowEvent *);(更强大,但稍微复杂一点)

    或者只是定义自己的show()插槽,它可以完成您想要的操作并在其末尾调用QWidget :: show()。我更喜欢后者,所以我会告诉你。

    首先定义你的show slot,如下所示:

    namespace Ui { class MainWindow; }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT 
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    public slots:
        void doSomething() {}
        void show();
    
    private:
        Ui::MainWindow *ui;
    };
    

    然后,在您的实现文件中,执行以下操作:

    void MainWindow::show()
    {
        doSomething();
        QWidget::show();
    }
    

    我已经使用Qt框架很长一段时间了,我从来没有需要覆盖show事件;对于大多数用例来说,它根本不值得。如果你真的想要一个其他人可以连接的节目信号,只需为它添加一个自定义信号并在MainWindow::show()中放入。如果你不能为你正在做的事情做这项工作,那么只能使用重写事件处理程序(非常很少需要)。

答案 1 :(得分:1)

默认情况下该信号不存在,我们必须创建它,我们可以覆盖showEvent()方法:

<强>·H

protected:
    void showEvent(QShowEvent *event);

signals:
    void showSignal();

<强>的.cpp

 connect(this, &StartWindow::showSignal, this, &StartWindow::doSomething);

void StartWindow::showEvent(QShowEvent *event)
{
    emit showSignal();
    QMainWindow::showEvent(event);
}

void StartWindow::doSomething()
{
    qDebug()<<"show";
}

或者您可以覆盖eventFilter方法。

<强>·H

protected:
    bool eventFilter(QObject *watched, QEvent *event);

signals:
    void showSignal();

<强>的.cpp

installEventFilter(this);

connect(this, &StartWindow::showSignal, this, &StartWindow::doSomething);

bool StartWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==this && event->type() == QEvent::Show)
        emit showSignal();
    return QMainWindow::eventFilter(watched, event);
}