Различают конструктор и исполняемый код - PullRequest
1 голос
/ 21 апреля 2009

У меня есть два процесса, которые обмениваются сообщениями друг с другом. Процесс A является обычной (то есть не-qt) программой, которая отправляет сообщения процессу B. Процесс B - это приложение QT GUI, отображающее полученные сообщения в текстовом поле.

Я создал настраиваемый виджет (называемый ShowMessages), который наследуется от QPlainTextEdit и читает сообщения из канала по истечении таймера, и добавляет их в текстовое поле. Код на самом деле не спроектирован таким образом (я думаю, это был бы довольно плохой дизайн), но здесь все просто. По причинам, которые я не скажу, процесс A не может быть остановлен, пока я создаю форму с помощью qt-designer.

Проблема в том, что, хотя я использую 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 Ответ

1 голос
/ 21 апреля 2009

Может быть, ваш виджет должен иметь флаг для того, чтобы он был «активен», и по умолчанию он имеет значение 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 () плагина.

Согласно документу, вы в принципе можете установить свой «inDesignerFlag» в true в функции initialize () вашего виджета. Затем определите этот флаг там, где требуется в коде вашего виджета.

...