나는 최근에 너무 많은 Qt를 개발을 완료하지 않은,하지만 난 제대로 기억한다면, 당신은
편집 (대신 QApplication::exec()
을 통해 Qt의 메인 루프를 시작하는) 자신의 이벤트 루프 내에서 QApplication::processEvents()
를 호출 할 수 I 느린 일요일 아침에 PyQt (Qt 용 Python 바인딩)을 테스트하고/배우고 아래에 개념 증명 (proof-of-concept) 코드를 결합했습니다. QApplication::exec()
에 대한 호출을 QApplication::processEvents()
을 기반으로하는 사용자 지정 이벤트 루프로 바꾸면이 작동합니다.
나는 또한 simpleeventloop.cpp
과 tpclient-cpptext main.cpp
을 빨리 보았습니다. 그것의 모양에서, QApplication::processEvents()
어딘가에 SimpleEventLoop::runEventLoop()
의 어딘가에 추가하는 것은 좋을 것이다. 메인 루프에 추가하기 위해, 나는 아마
tv.tv_sec = 0;
tv.tv_usec = 10000; // run processEvents() every 0.01 seconds
app->processEvents();
와 lines 106
through 117
의 select()
기능에 대한 tv
간격을 교체하고 void SimpleEventLoop::runEventLoop(QApplication *app)
에 line 89
의 서명을 변경합니다. 클라이언트 구현에 일반적인 Qt를 추가하는 것이 좋습니다 (tpclient-cpptext main.cpp
대체)
해킹처럼 보입니다. 아마도 시작하기 위해 이와 같은 것으로 시작할 것입니다. 제 생각에 TPSocket
을 포장하고 QAbstractEventDispatcher
을 QEventLoop
으로 전달하기 위해 Qt의 각 개념 내에 타이머를 넣는 것이 더 나은 장기적인 해결책이라고 생각합니다. 그러면 runEventLoop()
이 QApplication::exec()
으로 전화하기 만하면됩니다. 그러나 전에는 QAbstractEventDispatcher
을 사용한 적이 없으므로 내 의견을 들어보십시오.
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore
# Global variable used as a quick and dirty way to notify my
# main event loop that the MainWindow has been exited
APP_RUNNING = False
class SampleMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
global APP_RUNNING
APP_RUNNING = True
# main window
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Test')
self.statusBar().showMessage('Ready')
# exit action (assumes that the exit icon from
# http://upload.wikimedia.org/wikipedia/commons/b/bc/Exit.png
# is saved as Exit.png in the same folder as this file)
exitAction = QtGui.QAction(QtGui.QIcon('Exit.png')
,'Exit'
,self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
self.connect(exitAction
,QtCore.SIGNAL('triggered()')
,QtCore.SLOT('close()'))
# main menu
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
# toolbar
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
# text editor
textEdit = QtGui.QTextEdit()
self.setCentralWidget(textEdit)
#tool tip
textEdit.setToolTip('Enter some text')
QtGui.QToolTip.setFont(QtGui.QFont('English', 12))
def closeEvent(self, event):
reply = QtGui.QMessageBox.question(self
,'Message'
,"Are you sure?"
,QtGui.QMessageBox.Yes
,QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
global APP_RUNNING
APP_RUNNING = False
else:
event.ignore()
# main program
app = QtGui.QApplication(sys.argv)
testWindow = SampleMainWindow()
testWindow.show()
# run custom event loop instead of app.exec_()
while APP_RUNNING:
app.processEvents()
# sleep to prevent that my "great" event loop eats 100% cpu
time.sleep(0.01)
내 목표는 이벤트 루프를 제대로 통합하기 위해 AbstractEventDispatcher를 사용하는 것이지만 Qt의 초보자가 너무 빠르다. 그냥 자리에서 작동하는 솔루션을 얻는 동안 측면 에서이 일을하려고합니다. SimpleEventLoop 클래스를 해킹하여 "실행 중"상태를 반환 할 수 있도록 해 주므로 예제와 비슷한 while 문으로 주 앱에서 확인할 수 있습니다. 어떻게 작동하는지 알려 드리겠습니다. 내가 걱정하는 것은 부스트 신호 콜백이 Qt 애플리케이션 내부에서 제대로 처리 될지 여부입니다. – mhilmi
@Gimpyfuzznut : simpleeventloop.cpp에 대한 샘플 해킹을 추가했습니다. SimpleEventLoop :: runEventLoop()의 현재 구현은 표준 이벤트 루프를 구현하기 때문에 제안 된 해킹이 가장 복잡 할 수 있습니다 (예 : http://stackoverflow.com/questions/658403/how-would-you-implementa-a- basic-event-loop/658495 # 658495 설명), 따라서 신호 나 타이머가 SimpleEventLoop :: endEventLoop()을 실행 이벤트 루프의 일부로 호출하지 않으면 절대로 반환하지 않습니다. – stephan