PyQ的优雅命令行参数解析

2024-04-19 05:54:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个新的PyQt应用程序。我正在尝试使用尽可能多的pyqtapi来完成与程序和ui相关的所有工作,以提高我对PyQt和Qt的总体知识。

我的问题是,PyQt/Qt中是否有一个API来优雅地处理命令行参数解析?

到目前为止,我的研究发现:

  • 一个如何使其成为play nice with python's opt_parser模块的示例,但它不处理QApplication的内置arg解析。
  • PyKDE's KCmdLineArgs(引入了不需要的KDE依赖项)
  • 看起来KCmdLineArgs作为QCommandLineParser被移植到Qt5.1的上游,这很酷,但是我希望现在就可以使用它,而不是18个月以后。

那么PyQt应用程序通常如何处理这个问题呢?或者opt_parser/argparse是正确的方法吗?

这远不是一个好的解决方案。。。

#!/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)

Tags: thetoinaddparserforargparsehelp