LINUX.ORG.RU

PySide, сигналы, печать


0

1

PySide 1.0.8

Пытаюсь прикрутить печатную форму с предпросмотром к гуевине на сабже. Имеется такой код:

class Main(QApplication):
    ...
    def measureMasterFinished(self):
        self.resultswindow = self.loadWindow("result-frame")
        self.resultswindow.show()
        self.connect(
                     self.resultswindow.printButton,
                     SIGNAL("pressed()"),
                     self,
                     SLOT("resultPrintDialog()")
                     )
    ...

    def resultPrintDialog(self):
        dialog = QPrintPreviewDialog(parent = self.resultswindow.resultPrintForm)
        dialog.connect(
                       SIGNAL("paintRequested(QPrinter(object))"),
                       self.resultswindow.resultPrintForm.print_
                       )
        dialog.exec_()
    ...

result-frame - это QFrame с плашкой QTextBrowser resultPrintForm и кнопками closeButton и printButton

loadWindow соответственно, подгружает .ui, сгенеренный дизайнером.

Необходимо по нажатию printButton показать QPrintPreviewDialog из которого уже будет команда на печать. Фигня в том, что без подключения paintRequested диалог вообще пустой. В нем только верхний тулбар есть. А подключить этот сигнал оно не дает. То сигнатура не нравится, то, как в примере выше: You can't add dynamic slots on an object originated from C++. New-style signal-slot connection из документации работают точно так же: не позволяет подключать динамические слоты:

You can't add dynamic slots on an object originated from C++. 
Traceback (most recent call last):
  File "/home/u/workspace/p/src/app/main.py", line 93, in resultPrintDialog
    dialog.paintRequested.connect(self.resultswindow.resultPrintForm.print_)
RuntimeError: Fail to connect signal paintRequested(QPrinter*).

При этом сигнал-слот без аргументов нормально работают.

Есть у кого вообще рабочий пример с печатью?

Сигнатура должна быть сохранена, придется делать враппер метод.
dialog.paintRequested.connect(self.resultswindow.resultPrintForm.doPrint)

в resultPrintForm
def doPrint(self, printer):
self.print_()

Про остальное, молчу (печать на паинт реквест... очень странное решение)

zJes ★★ ()
Ответ на: комментарий от zJes

Я не возражаю, что отрисовка parent-виджета в предпросмотре печати по сигналу - есть несколько неочевидное и, не побоюсь, бредовое решение. Но вот тут: http://www.qtcentre.org/threads/16069-Pratical-example-of-QPrintPreviewDialog...

советовали именно так.

А по врапперу: метод print_() у QTextBrowser имеет такую же сигнатуру (по документации), обязательный параметр QPrinter* printer

GateKeeper ★★ ()
Ответ на: комментарий от zJes

Сейчас попробую тогда, только пересоберу руками последние версии с pyside.org.

GateKeeper ★★ ()
Ответ на: комментарий от zJes

Пересобрал, заодно воткнул pyside-tools (pyside-uic)

class ResultsWidget(QFrame):
    def __init__(self, parent = None):
        QFrame.__init__(self, parent)
        self.ui = Ui_Frame()
        self.ui.setupUi(self)
...
class Ui_Frame(object):
    def setupUi(self, Frame):
        ...
        self.resultPrintForm = QtGui.QTextBrowser(Frame)


    def printWrap(self, printer):
        self.resultPrintForm.print_(printer)
...

class Main(QApplication):
    ...
        self.resultswindow = ResultsWidget()
        dialog.paintRequested.connect(self.resultswindow.ui.printWrap)
Так сработало. Спасибо.

GateKeeper ★★ ()
Ответ на: комментарий от GateKeeper

Эммм....
Ui_Frame - это разве не сгенерированный файл? Не замаешься printWrap переписывать?
Не проще его в ResultsWidget реализовать?
Плохое дело давать доступ к ui для остальных, форму чуть поменял в дизайнере, так вперед хвосты отсекать.
dialog.paintRequested.connect(self.resultswindow.printWrap)

    def printWrap(self, printer):
        self.ui.resultPrintForm.print_(printer)
zJes ★★ ()
Ответ на: комментарий от GateKeeper

Это даже не отпимизация, это стиль разработки, считай почти единственный правильный паттерн для работы с дизайнерским уи в питоне.

zJes ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.