В последнее время я не слишком много занимался разработкой Qt, но если я правильно помню, вы можете вызвать QApplication::processEvents()
в вашем собственном цикле событий (вместо запуска основного цикла Qt через QApplication::exec()
)
Редактировать: Я использовал возможность медленного воскресного утра, чтобы протестировать / узнать кое-что о PyQt (привязки Python для Qt) и собрать воедино доказательство код концепции ниже. Замена вызова на QApplication::exec()
пользовательским циклом событий, основанным на QApplication::processEvents()
, кажется работающим.
Я также быстро посмотрел на simpleeventloop.cpp
и tpclient-cpptext main.cpp
. Судя по всему, было бы неплохо просто добавить QApplication::processEvents()
где-нибудь в основной цикл SimpleEventLoop::runEventLoop()
. Чтобы добавить его в основной цикл, я бы, вероятно, заменил интервал tv
для функции select()
в строках * с 1030 * по 117
на
tv.tv_sec = 0;
tv.tv_usec = 10000; // run processEvents() every 0.01 seconds
app->processEvents();
и измените подпись в строке 89
на void SimpleEventLoop::runEventLoop(QApplication *app)
. Это должно быть хорошо, если вы добавите свой обычный Qt в вашу реализацию клиента (ваша замена tpclient-cpptext main.cpp
)
Похоже, что взломать. Я бы начал с чего-то подобного, чтобы начать. Я думаю, что ваша идея обернуть TPSocket
и таймер в соответствующие концепции Qt, чтобы перенаправить их с QAbstractEventDispatcher
в QEventLoop
это лучшее долгосрочное решение. Тогда должно быть достаточно, чтобы ваш 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)