Я разрабатываю программное обеспечение с виртуальным пианино, которым можно управлять с помощью миди-клавиатуры. То, что я пытаюсь сделать, это то, что мне нужен поток, наблюдающий за входами midi, и когда поступают данные, соответствующий процесс должен запускаться (здесь воспроизводится звук и анимируется клавиша). Как я могу сделать это с Qt Threading и событиями?
Потоки в PyQt
comment
Создайте тему. Издать сигнал. Если вам нужен более подробный ответ, вам нужно будет более конкретно указать, что вы пробовали и что не работает, а не запрашивать полный общий пример того, как использовать QThreads и сигналы.
- person jdi   schedule 23.03.2012
comment
У меня есть несколько кнопок вместо клавиш пианино. И я сделал программу, которая компьютерная клавиатура используется для игры на этих клавишах. И теперь я должен сыграть это на своей миди-клавиатуре. Итак, теперь я сделал это, так как при нажатии клавиши программа будет входить в цикл чтения миди, а затем запускать соответствующее действие. Но здесь другие функции Qt программы не выполняются. Поэтому я просто хотел реализовать отдельное событие, которое излучает сигнал, когда в миди-порте есть данные. Как я могу сделать с PyQt?
- person Hemanth Raveendran   schedule 23.03.2012
Ответы (2)
Вот хорошая страница о том, как использовать пользовательские сигналы: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
- Старый стиль: http://pyqt.sourceforge.net/Docs/PyQt4/old_style_signals_slots.html< /а>
- Новый стиль: http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html< /а>
А вот страница, показывающая, как использовать QThread: http://joplaete.wordpress.com/2010/07/21/threading-with-pyqt4/
Это почти все, что вам нужно. Вы создаете QThread с функцией run(), которая будет зацикливать и контролировать ваш миди-порт, а затем выдавать пользовательский сигнал. Вы бы начали этот поток с запуска вашего приложения. И вы должны подключить пользовательский сигнал QThread, который вы создали, к обработчикам в вашем основном приложении или к любому виджету, который должен быть уведомлен.
person
jdi
schedule
23.03.2012
Вот вам небольшой пример:
import time
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import SIGNAL, QObject
class DoSomething(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
def run(self):
time.sleep(3)
self.emit(SIGNAL('some_signal'))
def signalHandler():
# We got signal!
print 'Got signal!'
sys.exit(0)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
# Create new thread object.
d = DoSomething()
# Connect signalHandler function with some_signal which
# will be emited by d thread object.
QObject.connect(d, SIGNAL('some_signal'), signalHandler, QtCore.Qt.QueuedConnection)
# Start new thread.
d.start()
app.exec_()
person
Adam
schedule
23.03.2012
Это сигнальный слот старого стиля. Вы должны попробовать обновить это до новой, более питонической версии.
- person jdi; 24.03.2012
Да я вижу. Спасибо за ссылки в вашем ответе.
- person Adam; 24.03.2012