Различие между конструктором и кодом времени выполнения

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

Я создал настраиваемый виджет (под названием ShowMessages), который наследуется от QPlainTextEdit и считывает сообщения из конвейера по истечении времени таймера и добавляет их в текстовое поле. Код на самом деле не разработан таким образом (я думаю, что это было бы довольно плохим дизайном), но это просто для того, чтобы все было просто. По причинам, которые я не буду называть, процесс А нельзя остановить, пока я создаю форму с помощью 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, чтобы узнать, нахожусь ли я в дизайнере? Считаете ли вы, что различие между кодом дизайнера и кодом времени выполнения «плохо»?

(Извините за ошибки, но английский не мой основной язык)


person Emiliano    schedule 21.04.2009    source источник


Ответы (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().

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

person Community    schedule 21.04.2009