0

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

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

问题是当我使用 qt 设计器时(因此选择 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 函数可以知道我是否在设计器中?你认为区分设计器和运行时代码是“坏的”吗?

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

4

1 回答 1

1

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

但我不得不说,听起来您将“控制器”代码放入“视图”小部件中,这可能并且可能会给您带来麻烦(包括您现在遇到的当前 Qt 设计器问题)。

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

更新:

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

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

要在 Qt Designer 中为自定义小部件提供特殊行为,请提供 initialize() 函数的实现,以针对 Qt Designer 特定行为配置小部件构造过程。此函数将在任何调用 createWidget() 之前第一次调用,并且可能会设置一个内部标志,稍后当 Qt Designer 调用插件的 createWidget() 函数时可以对其进行测试。

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

于 2009-04-21T17:52:53.390 回答