• 8132阅读
  • 9回复

请问如何使用Qt开发启动界面--splashWindow [复制链接]

上一主题 下一主题
离线hbliao
 

只看楼主 倒序阅读 楼主  发表于: 2006-04-03
请问如何使用Qt开发启动界面--splashWindow
向斑竹及大家请教一个问题:如何使用Qt开发启动界面--splashWindow? 走QTimer的路线好象行不通,并不想用QThread来解决, 如果你熟悉请告诉我大致的思路或示意代码好吗?
[ 此贴被XChinux在2006-04-04 08:24重新编辑 ]
离线hbliao

只看该作者 1楼 发表于: 2006-04-04
请问如何使用Qt开发启动界面--splashWindow

向斑竹及大家请教一个问题:如何使用Qt开发启动界面--splashWindow? 走QTimer的路线好象行不通,并不想用QThread来解决, 如果你熟悉请告诉我大致的思路或示意代码好吗?

说明:我需要在qte 2.3.x版本下实现这一功能, 感谢版主之前介绍的在Qt4下开发启动界面的程序.
离线hbliao

只看该作者 2楼 发表于: 2006-04-04
非常感谢版主的回复,您的这个解决方法我昨天已经仔细地看过了.不过不同的是的:我开发的是Qtembedd 2.3.x的程序(Qt 2.3.xVersion),在Qt2.x版本中没有您所使用到的4.x版本中的类:QSplashScreen.

如果使用无边框的Widget的话,控制其显示时间是蛮难的问题(我就是被卡在这里,一般总是启动界面很快就显示完了,接着就是MainWidget的界面了。)如果不使用QThread的话。如果在java中可以使用如下的方法:
thread.currentThread().sleep() 使主线程暂停下来,但确实不知道在Qt2版本中如何实现启动界面,我想了很多天了,当始终没有很好地解决,版主您能帮帮我吗?
离线XChinux

只看该作者 3楼 发表于: 2006-04-04
在你的SplashWindow里用一个QTimer计时,在创建主窗体之前先创建这个SplashWindow
主窗体不show,等计时器时间一到,然后把splashwindow delete掉,调用主窗体show出来。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 4楼 发表于: 2006-04-04
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hbliao

只看该作者 5楼 发表于: 2006-04-04
说明:MainWindow,SplashWindow,QIdel都是自定义继承至QWidget的类,QPEApplication类和QApplication类类似,可等同看待。

class QIdel: public QWidget
{
public:
   QIdel(QWidget* parent=0,const char* name=0,WFlags fl=0);
   ~QIdel();
       
   void init(QPEApplication* application,MainWindow* main,SplashWindow* sp);

   QPEApplication* app;
   MainWindow* main;
   SplashWindow* sp;

public slots:
   void hide();

};

void QIdel::init(QPEApplication* application,MainWindow* main,SplashWindow* sp)
{
   this->app=application;
   this->main=main;
   this->sp=sp;
}

QIdel::QIdel(QWidget* parent,const char* name,WFlags fl):QWidget(parent,name,fl)
{
}

QIdel::~QIdel()
{
}

//slots
void QIdel::hide()
{    
   sp->close();
   app->setMainWidget(main);
}

int main(int argc, char** argv)
{
  QPEApplication app(argc, argv);
   MainWindow* mw=new MainWindow();
   SplashWindow* sp=new SplashWindow();
   sp->show();

   QIdel* id=new QIdel();
   id->init(&app,mw,sp);
   QTimer::singleShot(4*1000,id,SLOT(hide()));
     //app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
  return app.exec();
}

程序运行结果:显示sp对象4秒,之后消失,当我要的mw对象却没有显示出来,好似乎没有执行void hide()函数里的语句:app->setMainWidget(main);,程序就此结束,还敬请总版主协助查看一下,不胜感谢!
离线XChinux

只看该作者 6楼 发表于: 2006-04-04
你的mw(mainwindow)并没有show(),你只是在idle里面setMainWidget()了,而并没有show出来,那自然不会显示出来了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hbliao

只看该作者 7楼 发表于: 2006-04-04
QIdel类的作用并不是很大,在这里我只是经我覆盖后借用其槽函数:virtual void hide() ,调用QApplication对象的setMainWidget()函数可以使对象显示出来。按照您的说法,我在hide()函数里再加一些代码:
void QIdel::hide()
{  
  sp->close();
  app->setMainWidget(main);
  main->show();
}

main对象(也就是之前我创建的mw对象)仍旧没有正确地显示出来。问版主:1、总的来说,我这个思路是否可行?如果可行我再仔细查找原因并向您汇报结果。 2、您也帮我分析一下:为什么语句app->setMainWidget(QWidget*);在main函数中调用就能正确显示出来,而放到QIdel::hide()成员函数里执行就没法正确显示主界面?(在此app是一个QApplication或QPEAlication对象)
离线hbliao

只看该作者 8楼 发表于: 2006-04-04
问题已经解决了,感谢版主给予的支持!

原来存在的问题:setMainWidget(QWidget*) 替换成 showMainWidget(QWidget*,bool)才行.
离线ubuntu-lp
只看该作者 9楼 发表于: 2009-12-29
是要让显示启动画面的时间长一点么?
快速回复
限100 字节
 
上一个 下一个