通过 qt 对发送方和接收方使用自动生成的 Ui



需要显示umi后调用一个方法,所以我想连接 帧与自身,特别是使用显示信号。 我用 qtcreator 自动生成的代码创建了一个新表单。这是自动生成的标头。

#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()));

正确的方法是什么?

默认情况下该信号不存在,我们必须创建它,我们可以覆盖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);
}

这里有一些错误:

  1. 没有 show() 信号和
  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 *);(更健壮,但稍微复杂一些)

或者简单地定义你自己的 show() 插槽,它做你想做的事,并在它结束时调用 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框架已经有一段时间了,我从不需要覆盖show事件;对于大多数用例来说,这根本不值得。如果您真的想要其他人可以连接的显示信号,只需为其添加自定义信号并在MainWindow::show()中发出即可。仅当您无法使其适用于您正在做的事情时才求助于重写事件处理程序(很少需要)。

相关内容

  • 没有找到相关文章