有没有告诉当“秀”功能完成的信号?
我在我的代码中的问题:如果我写的:
QMainWinObj.show();
QMainWinObj.someGuiFunc();
该代码不起作用。 但是,如果我写的:
QMainWinObj.show();
sleep(3000);
QMainWinObj.someGuiFunc();
它的作用。
所以我觉得这个问题是我之前所说的“someGuiFunc”秀'不到风度完成其JUB。 这就是为什么我希望有一些那种“秀”结束的标志..
有没有告诉当“秀”功能完成的信号?
我在我的代码中的问题:如果我写的:
QMainWinObj.show();
QMainWinObj.someGuiFunc();
该代码不起作用。 但是,如果我写的:
QMainWinObj.show();
sleep(3000);
QMainWinObj.someGuiFunc();
它的作用。
所以我觉得这个问题是我之前所说的“someGuiFunc”秀'不到风度完成其JUB。 这就是为什么我希望有一些那种“秀”结束的标志..
这可能有点过时,但因为没有人回答了这个问题,除了一个:既然没有“显示”信号,我建议重写这样的演出活动:
在您的mainwindow.cpp文件:
void MainWindow::show()
{
QMainWindow::show();
QApplication::processEvents();
emit windowShown();
}
在你mainwindow.h文件,介于主窗口的声明:
...
class MainWindow: public QMainWindow
{
...
signals:
void windowShown();
...
}
...
然后,当你去设计,用鼠标右键单击主窗口(对象树的最顶部),然后选择“更改信号/插槽”。 在“信号”框,点击“+”按钮,你将需要添加“windowShown()”,然后按回车键,然后OK按钮(注意,省略号“...”表示其他代码,已经在你的头)。
这就是它 - 你现在可以使用信号/插槽编辑,每当你想达到的“windowShown”信号链路插槽。 现在,如果你想要的东西更像是微软的“装”事件,我认为在.NET使用,您将需要创建它,因此每次显示的窗口,它不是发出一些实例变量和标志,例如:
void MainWindow::show()
{
QMainWindow::show();
QApplication::processEvents();
emit windowShown();
if (firstTimeShown == true)
{
emit windowLoaded();
firstTimeShown = false;
}
}
另外,不要忘了在构造函数初始化变量为“真”:
MainWindow::MainWindow(QObject* parent)
...
{
firstTimeShown = true; // put this somewhere before ui->setupUi()
}
如果你决定把它的初始化列表但要确保它在正确的顺序。 编译器会抱怨,如果变量没有顶至底的方式实例化在类的头部声明。
现在,确保当你在你的头定义firstTimeShown,你让它私有。 而且别忘了还有添加信号:
class MainWindow : public QMainWindow
{
...
signals:
void windowLoaded();
void windowShown();
private:
bool firstTimeShown;
...
仅此而已。 随着信号和槽的灵活性,它很容易模仿,你可能会从Windows窗体或从MFC找到任何事件。 它只是需要程序员的部分一点点的努力。 一旦你得到了它的窍门然而,它就会像自然。
注意:有可能是优化或更好,使得“装载”,“中显示”信号进行更精确的方式,但我已经离开了这样的事情出来为简单起见。 而回来手头上的问题,要求的QApplication :: processEvents()是最有可能你想要做的,而不是因为谁知道,如果用户正在运行的其他100米的东西会多长时间等待的固定时间量是什么它的上面,等等,等等。希望帮助,多余的解释被列入希望它可能给你一个更好的方式来做到这一点,你想做的事,而不是等待事情做了,“知道”它做的事情是一个更好的选择。
有没有这样的信号,但有QMainWindow的子类可以覆盖showEvent事件。
void MainWindow::showEvent(QShowEvent *){
//your code
}
更多资讯: http://qt-project.org/doc/qt-4.8/qwidget.html#showEvent
要知道这就是所谓的每一个你的窗口即将被显示的时间。
问题不继承,只需安装事件过滤器这样的决定:
class CWidgetIsPainting_EF : public QObject
{
bool m_bIsPainted = false;
public:
CWidgetIsPainting_EF( QObject * parent = 0 ) : QObject (parent) { }
inline bool IsPainted() const { return m_bIsPainted; }
inline void setIsPainted( bool bIsPainted ) { m_bIsPainted = bIsPainted; }
protected:
bool eventFilter( QObject * obj, QEvent *event )
{
if (event->type() == QEvent::Paint)
{
m_bIsPainted = true;
return true;
};
return QObject::eventFilter(obj, event);
}
};
......
CWidgetIsPainting_EF * pPaintingEF = new CWidgetIsPainting_EF( m_pWidget );
m_pWidget->installEventFilter( pPaintingEF );
......
while ( !pPaintingEF->IsPainted() )
QApplication::processEvents();
覆盖bool event(QEvent *event)
,赶上Paint事件。 作品对我来说,至少在Windows上。
// MainWindow.h
class MainWindow : public QMainWindow
{
...
bool event(QEvent *event) override;
void functionAfterShown();
...
bool functionAfterShownCalled = false;
...
}
// MainWindow.cpp
bool MainWindow::event(QEvent *event)
{
const bool ret_val = QMainWindow::event(event);
if(!functionAfterShownCalled && event->type() == QEvent::Paint)
{
functionAfterShown();
functionAfterShownCalled = true;
}
return ret_val;
}