[PySide] Qinputdialog

Sean Fisk sean at seanfisk.com
Wed Jul 3 08:43:56 CEST 2013


Hi David,

I‘ve wanted to do this before. I don’t think it's possible to use
QInputDialog.getInt() without a spin box, so constructing a custom
QDialogseems like the proper solution. I've also include a solution
with
QInputDialog, but that doesn't restrict the user to positive integers only.
Just give it a try and you'll see what I mean. I personally like the QDialogway.

I wasn't exactly sure what you meant by the sorting, so I just threw the
integers in a QListWidget. Unfortunately, the QListWidget sorting
algorithm<http://qt-project.org/doc/qt-4.8/qlistwidget.html#sortingEnabled-prop>sorts
lexicographically, not numerically. So I just used Python‘s list sort
and re-added all the numbers to the list. Not the nicest solution, but it
works. That shouldn’t be too hard to adapt to QTreeWidget.

Let me know if I misunderstood any part of your question.

~ Sean

Here is the code:

#!/usr/bin/env python
# Prompt the user for an integer and display it in a sorted list.#
Python 2.7 code
from PySide import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self._int_list = []

        self.setCentralWidget(QtGui.QWidget())

        self._layout = QtGui.QVBoxLayout(self.centralWidget())
        self._int_list_widget = QtGui.QListWidget()
        self._layout.addWidget(self._int_list_widget)

        self._add_int_qinputdialog_button = QtGui.QPushButton(
            'Add integer (QInputDialog)')
        self._add_int_qinputdialog_button.clicked.connect(
            self._add_int_qinputdialog)
        self._layout.addWidget(self._add_int_qinputdialog_button)

        self._add_int_qdialog_button = QtGui.QPushButton(
            'Add integer (Custom QDialog)')
        self._add_int_qdialog_button.clicked.connect(
            self._add_int_qdialog)
        self._layout.addWidget(self._add_int_qdialog_button)

    def _complain_about_integer(self):
            QtGui.QMessageBox.critical(
                self, 'Invalid Input', 'Please enter a positive integer.')

    def _add_int_to_list(self, text):
        try:
            integer = int(text)
        except ValueError:
            self._complain_about_integer()
            return
        if integer < 0:
            # For the QInputDialog solution, since it doesn't prevent
            # negatives.
            self._complain_about_integer()
            return
        self._int_list.append(integer)
        self._int_list.sort()
        self._int_list_widget.clear()
        self._int_list_widget.addItems(
            [str(integer) for integer in self._int_list])

    def _add_int_qinputdialog(self):
        text, ok = QtGui.QInputDialog.getText(
            self, 'Values id Dialog', 'Enter Id of the Value',
            inputMethodHints=QtCore.Qt.ImhDigitsOnly)
        if not ok:
            # User closed the dialog.
            return
        self._add_int_to_list(text)

    def _add_int_qdialog(self):
        dialog = IntDialog()
        accepted = dialog.exec_()
        if accepted == QtGui.QDialog.Rejected:
            # User closed the dialog.
            return
        self._add_int_to_list(dialog.int_text)
class IntDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(IntDialog, self).__init__(parent)

        self.setWindowTitle('Values id Dialog')

        self._layout = QtGui.QFormLayout(self)

        self._input_field = QtGui.QLineEdit()
        self._int_validator = QtGui.QIntValidator()
        self._int_validator.setBottom(0)
        self._input_field.setValidator(self._int_validator)

        self._layout.addRow('Enter Id of the Value', self._input_field)

        self._button_box = QtGui.QDialogButtonBox(
            QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)
        self._button_box.accepted.connect(self.accept)
        self._button_box.rejected.connect(self.reject)
        self._layout.addWidget(self._button_box)

    @property
    def int_text(self):
        return self._input_field.text()
def main(argv):
    app = QtGui.QApplication(argv)

    w = MainWindow()
    w.show()
    w.raise_()
    return app.exec_()
if __name__ == '__main__':
    import sys
    raise SystemExit(main(sys.argv))

On Tue, Jul 2, 2013 at 2:05 PM, <litltbear at gmail.com> wrote:

1. I want to get input from a user it will be an integer.  I'm trying
>         valueId, ok = QtGui.QInputDialog.getInt(self, 'Values id Dialog',
> 'Enter Id of the Value', minValue=0)
>
> and it always show a spin box.  How do i remove the spin box.
>
> 2. When I display the int I use:
>         item_0 = QtGui.QTreeWidgetItem(self.ValuesTree)
>         item_0.setText(0, str(value.valueId))
>
>         Is there a way to display int's to the screen as nit's so they can
> be sorted/displayed in numerical order?
>
> ie 11, 12, 104
>  not 104, 11, 12.
>
> David
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
>
-- 
Sean Fisk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20130703/f7248a84/attachment.html>


More information about the PySide mailing list