我需要在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
这样做的正确方法是什么?
答案 0 :(得分:1)
这里有一些问题:
首先,如果您的课程定义如下:
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);
}