从任意对象(Python 和 Qt)向文本框发送文本

Posted

技术标签:

【中文标题】从任意对象(Python 和 Qt)向文本框发送文本【英文标题】:Send text to textbox from arbitrary object (Python and Qt) 【发布时间】:2014-12-25 13:36:04 【问题描述】:

我需要能够从 node.py 中的“节点”类发送文本:

import datetime

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class node( QGraphicsItem ):
    def __init__( self, position, scene ):
        super( node, self ).__init__( None, scene )

        self.setFlags( QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable )

        self.rect = QRectF( -30, -30, 120, 60 )
        self.setPos( position )
        scene.clearSelection()

    def sendFromNodeToBox( self, text ):
        # how do i send text from here to textBox?
        pass

    def boundingRect( self ):
        return self.rect

    def paint( self, painter, option, widget ):
        painter.setRenderHint( QPainter.Antialiasing )
        pen = QPen( Qt.SolidLine )
        pen.setColor( Qt.black )
        pen.setWidth( 3 )

        if option.state & QStyle.State_Selected:
            #####################
            self.sendFromNodeToBox( 'node selected' )
            #####################
            self.setZValue( 1 )
            pen.setWidth( 4 )
            pen.setColor( Qt.green )
        else:
            pen.setWidth( 3 )
            self.setZValue( 0 )
        painter.setPen( pen )
        painter.setBrush( QColor( 200, 0, 0 ) )
        painter.drawRoundedRect( self.rect, 10.0, 10.0 )

mainWindow.ui中的statusBox,由mainWindow.py加载

import os, sip, sys, subprocess, platform

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.uic import *
from PyQt4.QtOpenGL import *

from src.node import *

app = None



class mainWindow( QMainWindow ):
    def __init__( self, parent = None ):
        super( mainWindow, self ).__init__( parent )


        self.currentPlatform = platform.system()

        if self.currentPlatform == "Windows":
            self.ui = loadUi( r'ui\mainWindow.ui', self )

        elif self.currentPlatform == "Darwin":
            self.ui = loadUi( r'ui/mainWindow.ui', self )

        else:
            print 'platform not supported'
            quit()

        # Scene view
        self.scene = SceneView()
        self.nodeDropGraphicsView.setViewport( QGLWidget( QGLFormat( QGL.SampleBuffers ) ) )
        self.nodeDropGraphicsView.setScene( self.scene )

        self.sendTextToBox( 'this text comes from mainWindow class, line 37 and 38.\n' )
        self.sendTextToBox( 'press right mouse button.\n' )


    def sendTextToBox( self, text ):
        cursorBox = self.statusBox.textCursor()
        cursorBox.movePosition(cursorBox.End)
        cursorBox.insertText( str( text ) )
        self.statusBox.ensureCursorVisible()


class SceneView( QGraphicsScene ):
    def __init__( self, parent=None ):
        super( SceneView, self ).__init__( parent )

        text = self.addText( 'title' )

    def mousePressEvent( self, event ):
        pos = event.scenePos()
        if event.button() == Qt.MidButton:
            pass

        elif event.button() == Qt.RightButton:
            newNode = node( pos, self )

        super( SceneView, self ).mousePressEvent( event )

    def mouseReleaseEvent( self, event ):
        print 'mouseReleaseEvent'

        self.line = None

        super( SceneView, self ).mouseReleaseEvent( event )

if __name__ == "__main__":

    app = QApplication( sys.argv )
    screenSize = QApplication.desktop().availableGeometry()
    window = mainWindow()
    window.resize( int( screenSize.width() ), int( screenSize.height() ) )
    window.show()
    app.exec_()

应用程序在 win 和 osx 上运行。 Linux 尚未测试。

需要 Python 2.7 和 Qt 4.8。

有什么建议吗?

完整的来源在这里:

https://www.dropbox.com/sh/lcetrurnemr2cla/AAD-Z6ijgTrG0qVU_cum5viua?dl=0

非常感谢您的帮助。

【问题讨论】:

请内嵌源代码... “发送文本”到底是什么意思? ekhumoro 在这方面帮助了我 :) 无论如何谢谢 【参考方案1】:

一种方法是在SceneView 类上定义一个自定义信号,然后图形项可以通过其场景发出文本:

class node( QGraphicsItem ):
    ...  
    def sendFromNodeToBox( self, text ):
        self.scene().textMessage.emit(text)

class SceneView( QGraphicsScene ):
    textMessage = pyqtSignal(str)

class mainWindow( QMainWindow ):
    def __init__( self, parent = None ):
        ...
        self.scene = SceneView()
        self.scene.textMessage.connect(self.sendTextToBox)

【讨论】:

以上是关于从任意对象(Python 和 Qt)向文本框发送文本的主要内容,如果未能解决你的问题,请参考以下文章

单击提交按钮时将自定义文本从选择框提交到文本区域

打开多行文本文件并仅读取其中的特定行。并将值发送到文本框

如何在 Python GUI 中从用户输入的数字中使用任意数量的可用文本框

Qt串口通信接收的数据怎么分开传给不同文本框显示

Python Qt GUI设计:QLineEdit和QTextEdit文本框类(基础篇—13)

Python Qt GUI设计:QLineEdit和QTextEdit文本框类(基础篇—13)