区分设计器和运行时代码

时间:2009-04-21 12:23:59

标签: user-interface qt4 pyqt4 gui-designer

我有两个相互扩展消息的进程。 进程A是一个普通的(即非qt)程序,它向进程B发送消息。 进程B是一个QT GUI应用程序,它将收到的消息显示在文本框中。

我创建了一个自定义的小部件(称为ShowMessages),它继承自QPlainTextEdit,并在计时器到期时从管道中读取消息,并将它们附加到文本框中。 代码并不是真的像这样设计(我认为这是非常糟糕的设计),但这只是为了简化这里。 由于我不会告诉的原因,当我使用qt-designer创建表单时,无法关闭进程A.

问题是,当我使用qt designer(因此选择ShowMessages小部件并将其放在窗口中)时,即使我在设计器中,小部件也会开始显示消息。这个功能很酷,但问题是当我保存表单时,已经存在的消息保存在.ui文件中,这导致当我启动进程B时出现错误行为(因为进程开始显示我在创建阶段收到的消息)

我可以在进程B启动后立即清理文本框,但我认为避免在.ui文件中出现的消息要好得多。我想要的是能够为小部件编写这样的代码:

if <I'm not in the designer>
    timer = QtCore.QTimer(self)
    QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("on_timer()"));
    timer.start(2000)

是否有qt函数可以知道我是否在设计师中?你认为区分设计师和运行时代码是“坏”吗?

(抱歉错误,但英语不是我的主要语言)

1 个答案:

答案 0 :(得分:1)

也许你的小部件应该有一个标志,它是否为“活动”并默认为False所以当你在设计师中时,它根本不做任何事情。在代码中,当您想要查看消息时,可以将其设置为活动状态。然后你也可以在其他场景中关闭它。

但我不得不说,这听起来好像你正在把“控制器”代码放到一个“视图”小部件中,这可能并且可能会给你带来麻烦(包括你现在拥有的当前Qt设计师问题) )。

如果你还没有,请考虑阅读MVC(模型 - 视图 - 控制器)设计模式。

<强>更新

公平地说,你的问题确实询问如何检测你是否在设计师中:)

http://doc.trolltech.com/4.3/designer-creating-custom-widgets.html#creating-well-behaved-widgets

  

为自定义小部件提供特殊功能   Qt Designer中的行为,提供一个   初始化()的实现   用于配置小部件的功能   Qt Designer的构建过程   具体行为。这个功能会   之前第一次被召唤   任何对createWidget()的调用都可以   也许设置一个可以的内部标志   稍后在Qt Designer调用时进行测试   插件的createWidget()函数。

根据文档,您基本上可以在窗口小部件的initialize()函数中将“inDesignerFlag”设置为true。然后在窗口小部件的代码中检测所需的标记。