QApplication' is not defined

pyqt, python, qt

Solution

If you read through the tutorial in order, you'd see that the previous article in the series showed the stuff you need to part at the start of each fragment to make it a runnable program. The author apparently did this so that the same code could be used with both PyQt and PySide.

So, if you're using PyQt4, you'll need to add this:

# Allow access to command-line arguments
import sys

# SIP allows us to select the API we wish to use
import sip

# use the more modern PyQt API (not enabled by default in Python 2.x);
# must precede importing any module that provides the API specified
sip.setapi('QDate', 2)
sip.setapi('QDateTime', 2)
sip.setapi('QString', 2)
sip.setapi('QTextStream', 2)
sip.setapi('QTime', 2)
sip.setapi('QUrl', 2)
sip.setapi('QVariant', 2)

# Import all of Qt
from PyQt4.Qt import *

If PySide:

# Allow access to command-line arguments
import sys

# Import the core and GUI elements of Qt
from PySide.QtCore import *
from PySide.QtGui import *

Below the box showing your this boilerplate, there's a nice, readable explanation of what it all means and why you need to do it.

However, I'd suggest that if you're trying to learn from a tutorial, you start at the start and work forward, instead of starting in the middle and trying to figure out what you missed along the way.

If you just do `from PyQt4 import QtGui, QtCore` instead of importing `*` from them, the names in those modules are available, but only as qualified names. That is, instead of `QApplication`, you have to write `QtCore.QApplication`.

If you don't understand the difference, read Modules in the official Python tutorial, or something equivalent, to learn how imports work.

Problem

I downloaded the script below from http://www.pythoncentral.io/pyside-pyqt-tutorial-interactive-widgets-and-layout-containers/ I get the following error message: NameError: name 'QApplication' is not defined I added the first two lines of the script. That did not help. I thought maybe I must not have qt installed. But when I tried to run PyQt4-4.10.3-gpl-Py2.7-Qt4.8.5-x32.exe, the program told me it was already installed. Does anyone have any suggestions? marc ``` # copied from http://www.pythoncentral.io/pyside-pyqt-tutorial-interactive-widgets-and-layout-containers/ # Every Qt application must have one and only one QApplication object; # it receives the command line arguments passed to the script, as they # can be used to customize the application's appearance and behavior import sys from PyQt4 import QtGui, QtCore #import PyQt4.QtGui, PyQt4.QtCore qt_app = QApplication(sys.argv) class AbsolutePositioningExample(QWidget): ''' An example of PySide absolute positioning; the main window inherits from QWidget, a convenient widget for an empty window. ''' def __init__(self): # Initialize the object as a QWidget QWidget.__init__(self) # We have to set the size of the main window # ourselves, since we control the entire layout self.setMinimumSize(400, 185) self.setWindowTitle('Dynamic Greeter') # Create the controls with this object as their parent and set # their position individually; each row is a label followed by # another control # Label for the salutation chooser self.salutation_lbl = QLabel('Salutation:', self) self.salutation_lbl.move(5, 5) # offset the first control 5px # from top and left self.salutations = ['Ahoy', 'Good day', 'Hello', 'Heyo', 'Hi', 'Salutations', 'Wassup', 'Yo'] # Create and fill the combo box to choose the salutation self.salutation = QComboBox(self) self.salutation.addItems(self.salutations) # Allow 100px for the label and 5px each for borders at the # far left, between the label and the combobox, and at the far # right self.salutation.setMinimumWidth(285) # Place it five pixels to the right of the end of the label self.salutation.move(110, 5) # The label for the recipient control self.recipient_lbl = QLabel('Recipient:', self) # 5 pixel indent, 25 pixels lower than last pair of widgets self.recipient_lbl.move(5, 30) # The recipient control is an entry textbox self.recipient = QLineEdit(self) # Add some ghost text to indicate what sort of thing to enter self.recipient.setPlaceholderText(""e.g. 'world' or 'Matey'"") # Same width as the salutation self.recipient.setMinimumWidth(285) # Same indent as salutation but 25 pixels lower self.recipient.move(110, 30) # The label for the greeting widget self.greeting_lbl = QLabel('Greeting:', self) # Same indent as the others, but 45 pixels lower so it has # physical separation, indicating difference of function self.greeting_lbl.move(5, 75) # The greeting widget is also a label self.greeting = QLabel('', self) # Same indent as the other controls self.greeting.move(110, 75) # The build button is a push button self.build_button = QPushButton('&Build Greeting', self) # Place it at the bottom right, narrower than # the other interactive widgets self.build_button.setMinimumWidth(145) self.build_button.move(250, 150) def run(self): # Show the form self.show() # Run the Qt application qt_app.exec_() # Create an instance of the application window and run it app = AbsolutePositioningExample() app.run() ```

Original source