Sto scrivendo una nuova app PyQt. Sto provando a fare tutto ciò che riguarda il programma e ui usare il maggior numero possibile di API PyQt come mezzo per migliorare la mia conoscenza di PyQt e Qt in generale.Argomento da riga di comando elegante per PyQt
La domanda che ho è, esiste un'API in PyQt/Qt per gestire l'argomento della riga di comando che analizza elegantemente?
La mia ricerca finora è alzato:
- un esempio di come farlo play nice with python's opt_parser modulo, tranne che non gestisce di QApplication costruito in arg analisi.
- PyKDE's KCmdLineArgs (che introduce una dipendenza indesiderata KDE)
- sembra KCmdLineArgs viene portato a monte per Qt5.1 come QCommandLineParser, che è fresco, ma mi piacerebbe essere in grado di usarlo ora, non 18 mesi da adesso.
Quindi, come le applicazioni PyQt gestiscono normalmente questo? o è opt_parser/argparse la strada da percorrere?
Questo è lontano da una bella soluzione ...
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, argparse
from PyQt4 import QtGui
def main(argv):
app = QtGui.QApplication(argv) # QApplication eats argv in constructor
# We can get a QStringList out of QApplication of those arguments it
# didn't decide were reserved by Qt.
argv2 = app.arguments()
# now we need to turn them back into something that optparse/argparse
# can understand, since a QStringList is not what it wants
argv3 = []
for i in argv2:
argv3.append(str(i))
# now we can pass this to optparse/argparse
process_args(argv3)
# dummy app
mw = QtGui.QMainWindow()
mw.show()
sys.exit(app.exec_())
def process_args(argv):
parser = argparse.ArgumentParser(description='PyQt4 argstest',
add_help=False)
# we now have to add all of the options described at
# http://qt-project.org/doc/qt-4.8/qapplication.html#QApplication
# but have them do nothing - in order to have them show up in the help list
# add this to the list if Qt is a debug build (How to detect this?)
parser.add_argument("-nograb", action=ignore,
help="don't grab keyboard/mouse for debugging")
# add these to the list if Qt is a debug build for X11
parser.add_argument("-dograb", action=ignore,
help="grab keyboard/mouse for debugging")
parser.add_argument("-sync", action=ignore,
help="run in synchronous mode for debugging")
# add all the standard args that Qt will grab on all platforms
parser.add_argument("-reverse", action=ignore,
help="run program in Right-to-Left mode")
# an example -- there are 10 such items in the docs for QApplication
# then we need to figure out if we're running on X11 and add these
parser.add_argument("-name", action=ignore,
help="sets the application name")
# an example -- there are 13 such items in the docs
# reimplement help (which we disabled above) so that -help works rather
# than --help; done to be consistent with the style of args Qt wants
parser.add_argument("-h", "-help", action='help',
help="show this help message and exit")
parser.parse_args(argv[1:])
class ignore(argparse.Action):
# we create an action that does nothing, so the Qt args do nothing
def __call__(self, parser, namespace, values, option_string=None):
pass
if __name__ == "__main__":
main(sys.argv)
L'intero punto del mio post su lateral.netmanagers.com.ar che hai menzionato è che gestisce l'analisi della riga di comando incorporata di QApplication. Si definiscono i propri argomenti usando opt_parse/argparse/qualunque e fintanto che non si definiscono gli stessi utilizzati da QApplication, tutto funziona correttamente. –