【问题标题】:Qt interface classQt接口类
【发布时间】:2013-03-20 07:29:11
【问题描述】:

我想使用这样的 main:

int main()
{
   if (param)
      QtDisp *disp = new QtDisp(); //no visual result
   else
      SDLDisp *disp = new SDLDisp();

   disp->init(param); //displays the window
 
   while (1)
   {
      disp->change_color(colour); //change background colour
      sleep(1);
   }
}

它适用于 SDLDisp,现在我必须创建 QtDisp。

我不知道如何处理阻塞的 exec()。首先,我想使用Qthread,但显示必须在第一个线程中。

【问题讨论】:

  • 在 QtDisp 的 timerEvent 中更改颜色(顺便说一句 - 以 Q 开头的类命名是个坏主意)
  • 嗯,程序可以使用Qt或者SQL,所以我要保留这个main。

标签: c++ qt interface


【解决方案1】:

Qt 是基于事件的驱动框架。如果没有事件循环,所有 gui 部分都将无法工作。除了可能在另一个线程中进行粗略计算之外,几乎所有事情都需要在事件循环中完成。 exec() 方法启动该事件系统。因此,在您调用 exec() 之前,您将无法做一些有用的事情。最简单的方法是:

int delay = 10; //msec
QTimer *colorChangeTimer() = new QTimer();
colorChangeTimer->setSingleshot(false);
connect(colorChageTimer, SIGNAL(timeout()), disp, SLOT(onTimerChageColor()));
colorChageTimer->start(delay);
int result = QApplication::exec();
delete colorChangeTimer;
return result;

【讨论】:

  • 如果您将disp 提供给colorChangeTimer(又名colorChangeTimer() = new QTimer(disp);)的构造函数,您可以只执行return QApplication::exec(); 而无需删除计时器对象
  • @borisbn 没错。但我实际上认为,当对象不是父级的成员时,将父级设置为对象是危险的。在这种情况下没关系,但如果 disp 将被删除,定时器将被销毁,但定时器指针可以被访问并且无法找到该指针是否有效。
  • 所以没有办法做我想做的事?
  • 为什么不想使用带有计时器和事件循环的解决方案?
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2011-04-17
相关资源
最近更新 更多