Esempio n. 1
0
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(500, 400)
        self.label = QLineEdit(self)
        self.label.setGeometry(0, 10, 450, 38)
        self.frame = QFrame(self)
        self.frame.setGeometry(120, 120, 100, 100)
        self.frame.setStyleSheet('background-color : #B9F9C5')
        print(self.frame.width())
        print(self.frame.height())
        print(self.frame.pos())
        self.setAcceptDrops(True)

    def dragEnterEvent(self, a0: QtGui.QDragEnterEvent) -> None:
        self.setWindowTitle('mouse in')
        print(a0.mimeData().text())
        a0.accept()

    def dragMoveEvent(self, a0: QtGui.QDragMoveEvent) -> None:
        print(a0.pos())
        # pass

    def dropEvent(self, a0: QtGui.QDropEvent) -> None:
        self.setWindowTitle('mouse drop')
        if self.frame.pos().x() <= a0.pos().x() <= self.frame.pos().x() + self.frame.width() \
                and self.frame.pos().y() <= a0.pos().y() <= self.frame.pos().y() + self.frame.height():
            self.label.setText(a0.mimeData().text().replace('file:///', ''))
        print(a0.mimeData().text())
Esempio n. 2
0
class StreamScope( QWidget ):
    resize_signal  = pyqtSignal(int)
    resolutions    = [
        '320x200',  # CGA
        '320x240',  # QVGA
        '480x320',  # HVGA
        '640x480',  # VGA
        '720x480',  # 480p
        '800x480',  # WVGA
        '854x480',  # WVGA (NTSC+)
        '1024x576', # PAL+
        '1024x768', # XGA
        '1280x720', # HD
        '1280x768', # WXGA
        'Elastic'
    ]
    def __init__( self ):
        super().__init__()
        self.title_bar_h   = self.style().pixelMetric( QStyle.PM_TitleBarHeight )
        self.devices       = get_video_devices()
        self.device        = '/dev/{0}'.format( self.devices[0] )
        res                = self.resolutions[0].split( 'x' )
        self.res_w         = int( res[0])
        self.res_h         = int( res[1])
        self.stream_thread = QThread(parent=self)
        self.streamer      = DeskStreamer()
        self.streamer.moveToThread( self.stream_thread )
        self.streamer.finished.connect( self.stream_thread.quit )
        self.streamer.finished.connect( self.streamer.deleteLater )
        self.stream_thread.finished.connect( self.stream_thread.deleteLater )
        self.stream_thread.start()
        self.stream_thread.started.connect( self.streamer.long_running )

        self.setWindowTitle( self.__class__.__name__ )
        self.setGeometry( 0, 0, self.res_w, self.res_h )

        self.init_layout()

        self.setWindowFlags( self.windowFlags() # Keep existing flags
                             | Qt.WindowStaysOnTopHint 
        )

        
        # Show the window
        self.show()


    def init_layout( self ):
        layout1 = QVBoxLayout()
        layout2 = QHBoxLayout()

        # Get video devices
        combo      = QComboBox( self )
        for i, device in enumerate( self.devices ):
            combo.addItem( device )
            if device == 'video20':
               combo.setCurrentIndex( i )
               self.device = '/dev/{0}'.format( device )
        combo.activated[str].connect( self.comboChanged )

        resolution = QComboBox( self )
        for res in self.resolutions:
            resolution.addItem( res )
        resolution.activated[str].connect( self.resolutionChanged )


        # Buttons
        self.stream_btn = QPushButton( self, objectName='stream_btn' )
        self.stream_btn.setText( 'Stream' )
        self.stream_btn.clicked.connect( self.stream )

        self.stop_btn = QPushButton( self, objectName='stop_btn' )
        self.stop_btn.setText( 'Stop' )
        self.stop_btn.clicked.connect( self.stop )

        self.frame = QFrame(self )
        style='''
        QPushButton{
            text-align:center;
        }
        QPushButton#stream_btn{
        background-color: orange;
        }
        QPushButton#stop_btn{
        background-color: white;
        }
        QFrame{
        background-color: #3E3E3E;
        border-bottom-right-radius: 10px;
        border-bottom-left-radius:  10px;
        }
        '''

        self.frame.setStyleSheet( style )

        layout2.addWidget( self.stream_btn )
        layout2.addWidget( self.stop_btn )
        layout2.addWidget( resolution )
        layout2.addWidget( combo )
        self.frame.setLayout( layout2 )
        self.frame.setFixedHeight( self.frame.height()*1.5 )

        self.viewfinder = QLabel(self, objectName='view_finder')
        style='''
        QLabel{
        background-color: cyan;
        }
        QLabel#view_finder{
        border:5px solid orange;
        background:transparent;
        padding:0px;
        }
        '''
        self.viewfinder.setStyleSheet( style )
        self.viewfinder.setMinimumWidth( 0 )
        self.viewfinder.setMinimumHeight( 0 )
        self.viewfinder.setGeometry( QRect( self.frame.pos().x(), 0, self.res_w, self.res_h ) )
        layout1.addWidget( self.viewfinder )
        layout1.addWidget( self.frame )
        layout1.setSpacing(0)
        layout1.setContentsMargins( 0 ,0 ,0, 0 )
        self.setAttribute( Qt.WA_TranslucentBackground )
        self.setLayout( layout1 )
        self.update_frustum()

    def stream( self ):
        if not self.streamer.isStreaming():
            self.stream_btn.setStyleSheet( 'background-color: grey;' )
            self.stop_btn.setStyleSheet( 'background-color: red;' )
            self.viewfinder.setStyleSheet( 'background-color: cyan; border:1px hidden red; background:transparent; ' )
            self.update_frustum()
            self.streamer.stream()

    def stop( self ):
        if self.streamer.isStreaming():
            self.stream_btn.setStyleSheet( 'background-color: orange;')
            self.stop_btn.setStyleSheet( 'background-color: white;')
            self.viewfinder.setStyleSheet( 'background-color: cyan; border:5px solid orange; background:transparent; padding:0;' )
            self.streamer.stop()

    def comboChanged( self, text ):
        self.stop()
        self.device = '/dev/{0}'.format( text )

    def resolutionChanged( self, text ):
        self.stop()
        
        if text == 'Elastic':
            min_w = 0
            min_h = 0
            win_w = self.viewfinder.width()
            win_h = self.viewfinder.height()
            
        else:
            res = text.split( 'x' )
            self.res_w = int( res[0] )
            self.res_h = int( res[1] )
            min_w = self.res_w
            min_h = self.res_h
            win_w = self.res_w
            win_h = self.res_h
            
        self.viewfinder.setMinimumWidth( min_w )
        self.viewfinder.setMinimumHeight( min_h )
        self.viewfinder.setGeometry( QRect( self.frame.pos().x(), 0, win_w, win_h ) )
        self.setGeometry( QRect( self.pos().x(), self.pos().y(), win_w, win_h ) )
        self.adjustSize()

    def debug_frustum( self ):
        print( 'Window: {0}, {1}x{2}'.format( self.pos(), self.width(), self.height() ) )
        print( 'Status: {0}'.format( self.title_bar_h ) )
        print( 'Scope:  {0}, {1}x{2}'.format( self.viewfinder.pos(),self.viewfinder.width(), self.viewfinder.height() ) )
        print( 'Device: {0}'.format( self.device ) )

    def update_frustum( self ):
        #self.debug_frustum()
        self.streamer.x = self.pos().x() + self.viewfinder.pos().x() + 0
        self.streamer.y = self.pos().y() + self.viewfinder.pos().y() + self.title_bar_h + 5
        self.streamer.width  = self.viewfinder.width()
        self.streamer.height = self.viewfinder.height()
        self.streamer.device = self.device

    def moveEvent( self, event ):
        self.stop()
        self.update_frustum()
        super().moveEvent(event)

    def resizeEvent(self, event = None):
        self.stop()
        self.update_frustum()
        self.resize_signal.emit( 1 )

    def closeEvent( self, event ):
        self.thread_clean_up()
        super().closeEvent( event )

    def thread_clean_up( self ):
        print( 'Cleaning up thread' )
        self.streamer.exit()
        self.stream_thread.quit()
        self.stream_thread.wait()