Сигналы PyQt4 и слоты

Я пишу свое первое приложение Python с PyQt4. У меня есть MainWindow и Диалоговый класс, который является частью класса MainWindow:

self.loginDialog = LoginDialog();

Я использую слоты и сигналы. Вот связь, установленная в MainWindow:

QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL("aa(str)"), self.login)

И я пытаюсь испустить сигнал в Диалоговом классе (я уверен, что он испускается):

self.emit(QtCore.SIGNAL("aa"), "jacek")

К сожалению, слот не вызывается. Я попробовал без аргументов также, различных стилей испускания сигнала. Никакие ошибки, никакие предупреждения в коде. Какова могла бы быть проблема?

6
задан Jacek 12 January 2010 в 10:10
поделиться

6 ответов

Вы не используете тот же сигнал, при излучате и подключении.

QTCORE.Signal («AA (STR)») не совпадает с qtcore.signal («Aa») . Сигналы должны иметь такую ​​же подпись. Кстати, если вы определяете свои собственные сигналы, не определите параметры. Просто напишите сигнал ('aa'), потому что определяющие параметры - это вещь от C ++, и Python версия Qt не нуждается в этом.

Так что он должен выглядеть так:

QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL("aa"), self.login)

и если вы передаете какие-либо параметры в Emit, ваш метод входа должен принять эти параметры. Проверьте, если это поможет: -)

12
ответ дан 8 December 2019 в 02:11
поделиться

Как отмечено Gruszczy, вы должны использовать тот же qtcore.signal ('xxx') для подключения сигнала и выдавать его. Также я думаю, что вы должны использовать типы Qt в списке аргументов функции сигнализации. Например:

QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL("aa(QString&)"), self.login)

, а затем выделяют:

self.emit(QtCore.SIGNAL("aa(QString&)"), "jacek")

иногда имеет смысл определять сигнал только один раз как глобальную переменную и использовать его в другом месте:

MYSIGNAL = QtCore.SIGNAL("aa(QString&)")
...
QtCore.QObject.connect(self.loginDialog, MYSIGNAL, self.login)
...
self.emit(MYSIGNAL, "jacek")
1
ответ дан 8 December 2019 в 02:11
поделиться

Я не использовал PYQT4, но посмотрите здесь .

0
ответ дан 8 December 2019 в 02:11
поделиться

Похоже, вы пропустите роль «слота» в вашем Connect Call.

Вот пример:

QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL("NotifyMySignal(int)"), QtCore.SLOT("onNotifyMySignal(int)"));

Тогда

self.emit(QtCore.SIGNAL('NotifyMySignal(1)'));

Надеюсь, это поможет!

0
ответ дан 8 December 2019 в 02:11
поделиться

No. Переменные «in scope» определяются «цепочкой scope», которая недоступна программно.

Для получения подробной информации (довольно много) ознакомьтесь со спецификацией ECMAScript (JavaScript). Вот ссылка на официальную страницу, где можно загрузить каноническую спецификацию (PDF), и вот ссылка на официальную версию HTML.

Обновление на основе вашего комментария к Camsoft

Переменные в области для вашей функции события определяются тем, где вы определяете свою функцию события, а не тем, как они ее называют. Но , вы можете найти полезную информацию о том, что доступно для вашей функции через этот и аргументы, делая что-то в соответствии с тем, что указал KennyTM ( для (var propName в ____) ), поскольку это скажет вам, что доступно на различных предоставленных вам объектах ( этот и аргументы; если вы не уверены, какие аргументы они вам дают, вы можете узнать через arguments переменную, которая неявно определена для каждой функции).

Поэтому в дополнение к тому, что находится в области действия из-за того, где вы определяете свою функцию, вы можете узнать, что еще доступно другими способами, выполнив следующие действия:

var n, arg, name;
alert("typeof this = " + typeof this);
for (name in this) {
    alert("this[" + name + "]=" + this[name]);
}
for (n = 0; n < arguments.length; ++n) {
    arg = arguments[n];
    alert("typeof arguments[" + n + "] = " + typeof arg);
    for (name in arg) {
        alert("arguments[" + n + "][" + name + "]=" + arg[name]);
    }
}

(Вы можете расширить его, чтобы получить более полезную информацию.)

Вместо этого, однако, я, вероятно, использовал бы отладчик, такой как инструменты разработки Chrome (даже если вы обычно не используете Chrome для разработки) или Firebug (даже если вы обычно не используете Firefox для разработки), или Dragonfly на Opera, или "F12 Разработчик И прочитайте все файлы JavaScript, которые они вам предоставляют. И бить их над головой за надлежащие документы.: -)

-121--645293-

Попробуйте выделить один блок (в отличие от списка 1MB блоков):

Dim p As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(New System.IntPtr(24 * (1024 ^ 3)))

Edit - Учитывая ваш комментарий, что у вас есть только 4GB физической оперативной памяти, у вас действительно нет бизнес-распределения > ~ 8GB и даже это толкает его.

Edit -

Чтобы принять ответ, я хотел бы знать, как вычисляется реальная максимальная выделенная память, если 8TB является только теоретической.

Максимальный объем ОЗУ, который вы можете выделить, вероятно, эквивалентен (Размер файла страницы - Размер всего в ОЗУ , за исключением , который не может или не будет помещен на страницу) + (Физический размер ОЗУ - Размер всего, что не может быть или не будет помещено на страницу, т.е. то, что необходимо для поддержания работы вашей системы... ядро, драйверы, .net и т.д.)

Конечно, файл страницы может расти...

Рано или поздно пейджинг на/с диска становится большим, а система замедляется до обхода контента и становится непригодной для использования.

Читайте блог Марка Руссиновича:

-121--2586079-

что

class Foo(QtCore.QObject):
    mysignal = QtCore.pyqtSignal(str, name='mysignal')

    def connect_to_signal(self):
        # you can use this syntax instead of the 'old' one
        self.mysignal.connect(self.myslot)

        # but this will also work
        self.connect(self, QtCore.SIGNAL('mysignal(QString)'), self.myslot) 

        self.mysignal.emit("hello")

    def myslot(self, param):
        print "received %s" % param

Для более подробного объяснения того, как сигналы/слоты работают в PyQt, я бы предложил просмотреть документацию, в частности в этом разделе .

3
ответ дан 8 December 2019 в 02:11
поделиться

Я проверил свой код, и он выглядит так, как проблема в том, как вы подключаете свой сигнал

  1. , вы издаете сигнал в классе UI_Dialog

    Self.emit (qtcore. Сигнал («AA ()»))

  2. Вы подключаетесь к сигналу в методе setupui ui_mainwindow путем вызова

    qtcore.qobject.connect (self.logindialog.ui, qtcore.signal ("aa ()"), self .Login)

Обратите внимание, что первый параметр изменен на Self.logindialog.ui ; Ваш оригинальный Connect Call был использоваться Self.LogindiLog, который имеет тип логидиндиализации, тогда как сигнал выделяется классом ui_dialog, который является свойством пользовательского интерфейса логининдиализации. После этого изменения входа в систему метод ui_mainwindow вызвал

Надеюсь, что это поможет, считает

3
ответ дан 8 December 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: