2017-05-24 82 views
0

我需要在显示UI之后调用方法,所以我想要连接 帧本身,特别是使用show信号。 我用qtcreator创建了一个自动生成的代码的新表单。这是自动生成的标题。使用自动生成的UI同时用于qt发送者和接收者

#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 
在cpp文件

以下代码没有一个工作

connect(ui,SIGNAL(QEvent::Show),this,SLOT(doSomething())); 

connect(*ui,SIGNAL(QEvent::Show),this,SLOT(doSomething())); 

connect(this->ui,SIGNAL(QEvent::Show),this,SLOT(doSomething())); 

怎样做正确的方式?

+0

'UI :: Foo'是一个POD类和既没有信号也没有槽。它唯一的用途是保存各种小部件和布局以及初始化代码。你想'连接(这,...,这,...)'。 –

回答

1

有几件事错在这里:

  1. 没有显示()信号和
  2. 即使有,你没有使用正确连接。

首先,如果你的类被这样定义:

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 *);(更强劲,但稍微复杂一些)

或简单地定义自己的节目()插槽,你想要和电话是什么QWidget :: show()在它的末尾。我更喜欢后者,所以我会告诉你。

开始通过定义这样你的节目插槽:

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框架工作了相当长的一段时间,而且我从不需要重写该节目;对于大多数使用情况来说,这是不值得的。如果您确实需要其他人可以连接的演出信号,只需添加一个自定义信号并发送至MainWindow::show()。如果你不能为你正在做的工作做好这项工作(只需要,很少需要),那么只能诉诸于重要的事件处理程序。

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); 
} 
+0

我使用了第一种方法,doSomething()方法连续运行,connect(....)字符串在StartWindow的构造函数中,所以有两个问题:第一个问题是信号连续发送,无论如何不发送时,窗体显示,但在构造函数。即使我添加一个断开连接doSomething插槽被称为窗体之前显示 –

相关问题