Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2016, 18:03   #1
OzMod
Новичок
Джуниор
 
Аватар для OzMod
 
Регистрация: 21.10.2016
Сообщений: 1
Восклицание PyQt4 работа с QListWidget()

Здравстуйте подскажте мне пожалуйста как обрабатывать события в виджете QListWidget().
у меня есть пока 2 вороса.
1) как написать обработчик сигнала , так что бы после выбора элемента из списка QListWidget()
скажем выбрал из списка -> "Один" то вывилось бы через print() в консольном окне скажем "Выбрана строка Один"
2) и второе как добавить контекстное меню в QListWidget(), как сделать так что бы после выбора элемента из списка скажем выбрал из списка -> "Один" кликнтул по нему правой кнопкой мыши , то появилось бы меню "Удалить" кликаю по нему и выбранная строчка удаляется.
Помогите пожалуйста допиште код представленный ниже!
Код:
from PyQt4 import Qt, QtGui, QtCore
import sys

class main(QtGui.QWidget):
    def __init__(self,parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.addLIST = QtGui.QListWidget()
        lst = ['Один','Два','Три']
        self.addLIST.addItems(lst)
        hbox =QtGui.QHBoxLayout()
        hbox.addWidget(self.addLIST)
        self.setLayout(hbox)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = main()
    window.setWindowTitle('Заголовок окна')
    sizeX, sizeY = (300, 70)
    window.resize(sizeX, sizeY)
    window.show()
    sys.exit(app.exec_())
OzMod вне форума Ответить с цитированием
Старый 22.10.2016, 19:30   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Если нужно что-то простое, то как правило хватает готовых решений.

А если нужен продвинутый функциона, события, фишки, плюшки, то сразу же берется нужные класс и на его базе уже разворачивается вся продвинутая конструкция.

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

Сразу скажу что код грязный. Для примера, пойдет. Но в реальной жизни, некоторые вещи так делать нельзя, что-бы избежать огромного гемороя с луну.

Вот как пример.
Простое решение
PHP код:
#!/usr/bin/python
# -*- coding: utf-8 -*-

from PyQt4.QtCore import QtQTimerSIGNALSLOTQEvent

from PyQt4
.QtGui import QListWidgetQListViewQHBoxLayoutQApplication
from PyQt4
.QtGui import QWidgetQPushButton


import sys

# #####################################################################
class MainProgQWidget ):

    
# =================================================================
    
def __init__(selfparent=None):

        
# ---------------------------------------------------------
        
QWidget.__init__(selfparent);
        
self.setGeometry400100570380 );
        
self.setWindowTitle('Window Title');
        
#self.setStyleSheet( 'QWidget{ background: #333; color: #fff; }' );

        # ---------------------------------------------------------
        
self.active '''
            QListWidget{ 
                background: #777; color: #0F0; border-style: solid; 
                border-width: 1px; border-color: #F00; 
            }'''
;

        
self.n_active '''
            QListWidget{ 
                background: #999; color: #000; border-style: solid; 
                border-width: 1px; border-color: #fff; 
            }'''
;


        
self.qLWs = {}; # Все QListWidget
        
self.qLWs['length']   = 0;
        
self.qLWs['this_id']  = '0';
        
self.qLWs['this_row'] = 0;


        
self.qLWs['0_info'] = {}; 
        
self.qLWs['0_info']['descr'] = 'my descr [0]'
        
self.qLWs['0_info']['name'] = 'zero-name'

        
self.qLWs['0'] = QListWidgetself ); 
        
self.qLWs['0'].setGeometry1010340280 );
        
self.qLWs['0'].setStyleSheet'QListWidget{ background: #666; color: #000; }' );

        
self.qLWs['0'].addItems( ['Aa_0','Bb_0','Cc_0'] );

        
self.connect
            
self.qLWs['0'], SIGNAL('itemSelectionChanged()'), 
            
lambdaself.qlistwidget_onSelect('0') );

        
self.qLWs['0'].itemClicked.connectlambdaself.qlistwidget_onSelect('0') );

        
self.qLWs['length'] += 1;

        
# ---------------------------------------------------------
        
self.qLWs['1_info'] = {}; 
        
self.qLWs['1_info']['descr'] = 'my descr [1]'
        
self.qLWs['1_info']['name'] = 'one-name'

        
self.qLWs['1'] = QListWidgetself ); 
        
self.qLWs['1'].setGeometry36010200280 );
        
self.qLWs['1'].setStyleSheet'QListWidget{ background: #777; color: #000; }' );

        
self.qLWs['1'].addItems( ['Aa10','Bb10','Cc_1'] );

        
self.connect
            
self.qLWs['1'], SIGNAL('itemSelectionChanged()'), 
            
lambdaself.qlistwidget_onSelect('1') );

        
self.qLWs['1'].itemClicked.connectlambdaself.qlistwidget_onSelect('1') );

        
self.qLWs['length'] += 1;
        
# ---------------------------------------------------------
        # http://pyqt.sourceforge.net/Docs/PyQt4/qlistwidget.html
        # self.qLWs['1'].currentItemChanged.connect( self.event_handler );
        # self.qLWs['1'].currentRowChanged.connect( self.event_handler );
        # self.qLWs['1'].currentTextChanged.connect( self.event_handler );
        # self.qLWs['1'].itemActivated.connect( self.event_handler );
        # self.qLWs['1'].itemChanged.connect( self.event_handler );
        # self.qLWs['1'].itemClicked.connect( self.event_handler );
        # self.qLWs['1'].itemDoubleClicked.connect( self.event_handler );
        # self.qLWs['1'].itemEntered.connect( self.event_handler );
        # self.qLWs['1'].itemPressed.connect( self.event_handler );
        # self.qLWs['1'].itemSelectionChanged.connect( self.event_handler );
        
        # ---------------------------------------------------------
        
self.delete_btn QPushButton'&Delete'self );
        
self.delete_btn.setGeometry100+2032012032  );
        
self.connectself.delete_btnSIGNAL('clicked()'), self.delete_this_elem );
        
# self.connect( self.delete_btn, SIGNAL('pressed()'), action ??? );
        # self.connect( self.delete_btn, SIGNAL('released()'), action ??? );

        
self.add_btn QPushButton'&Add'self );
        
self.add_btn.setGeometry100+15032012032  );
        
self.connectself.add_btnSIGNAL('clicked()'), self.add_new_elem );

        
# ---------------------------------------------------------


    # =================================================================
    
def qlistwidget_onSelectself_id ):

        for 
i in xrange(0self.qLWs['length'] ):
            
self.qLWsstr(i) ].setStyleSheetself.n_active );


        
self.qLWs_id ].setStyleSheetself.active );
        
val strself.qLWs_id ].currentItem().text() );
        
row self.qLWs_id ].currentRow();

        
self.qLWs['this_id'] = str_id );
        
self.qLWs['this_row'] = row;

        print(
"QListWidget: ID:["+_id+"] VAL: ["+val+"]; ROW: ["+str(row)+"]");
        print( 
self.qLWs[  _id+'_info']["name"], self.qLWs[  _id+'_info']["descr"] );


    
# =================================================================
    
def delete_this_elemself ):

        
_id self.qLWs['this_id']
        
_row self.qLWs['this_row']

        print(
'DELETE: -> ID: '_id'ROW: '_row );

        
self.qLWs_id ].takeItem_row );

    
# =================================================================
    
def add_new_elemself ):

        
_id self.qLWs['this_id']
        
_row self.qLWs['this_row']

        print(
'ADD: -> ID: '_id'ROW: '_row+);

        
# self.qLWs[ _id ].addItem( QListWidgetItem );
        # self.qLWs[ _id ].addItem( QString );

        
ttl_items self.qLWs_id ].count();

        
self.qLWs_id ].addItem"new item: ["+str(ttl_items+1)+"]" );


    
# =================================================================
    
def event_handlerself ):
        print( 
"event_handler: ok" );
    
# =================================================================

# ======================================================
if __name__ == "__main__":

    
app QApplication(sys.argv);

    
_MainProg MainProg();
    
_MainProg.show();

    
sys.exit(app.exec_()); 
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 22.10.2016, 19:31   #3
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Продвинутое решение:
Тоже самое но уже есть вожможность, работать на более низком уровне, сигналы, слоты, события и т.д.
PHP код:
#!/usr/bin/python
# -*- coding: utf-8 -*-

from PyQt4.QtCore import QtQTimerSIGNALSLOTQEvent

from PyQt4
.QtGui import QListWidgetQListViewQHBoxLayoutQApplication
from PyQt4
.QtGui import QWidgetQPushButtonQActionQMenuQIcon


import sys 
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 22.10.2016, 19:33   #4
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

PHP код:
# #####################################################################
class MyListWidgetQListWidget ):

    
# =================================================================
    
def __init__(selfparent=NoneS=[200200100100]):

        
# ---------------------------------------------------------
        
QListWidget.__init__(selfparent);

        
self.setGeometryS[0], S[1], S[2], S[3] );
        
self.setStyleSheet'QListWidget{ background: #666; color: #000; }' );

        
# ---------------------------------------------------------
        
self.L_BTN_CLICK                            False;
        
self.M_BTN_CLICK                            False;
        
self.R_BTN_CLICK                            False;

        
self.HAS_FOCUS                              False;

        
# ---------------------------------------------------------
        
self.active '''
            QListWidget{ 
                background: #777; color: #0F0; border-style: solid; 
                border-width: 1px; border-color: #F00; 
            }'''
;

        
self.n_active '''
            QListWidget{ 
                background: #999; color: #000; border-style: solid; 
                border-width: 1px; border-color: #fff; 
            }'''
;

        
# ---------------------------------------------------------
        # Actions 

        
self.delete_action QAction(QIcon("delete_action.png"), '&Delete'self);
        
self.delete_action.setShortcut('Ctrl+D');
        
self.delete_action.setStatusTip('Delete this item');
        
self.connectself.delete_actionSIGNAL('triggered()'), self.delete_this_elem );

        
self.add_action QAction(QIcon("add_action.png"), '&Add'self);
        
self.add_action.setShortcut('Ctrl+I');
        
self.add_action.setStatusTip('Add item');
        
self.connectself.add_actionSIGNAL('triggered()'), self.add_new_elem );

        
# ---------------------------------------------------------
        # context menu policy
        
self.setContextMenuPolicyQt.CustomContextMenu );
        
self.customContextMenuRequested.connectself.on_context_menu );

        
# context menu
        
self.popMenu QMenu"main_menu"self );
        
self.popMenu.addActionself.delete_action );
        
self.popMenu.addActionself.add_action );
        
self.popMenu.addSeparator();

        
self.sub_menu_0 QMenu"Options - 1"self );
        
self.sub_menu_0.addActionQAction('Opt 0-0'self) );
        
self.sub_menu_0.addActionQAction('Opt 0-1'self) );
        
self.sub_menu_0.addSeparator();
        
self.sub_menu_0.addActionQAction('Opt 0-2'self) );


        
self.sub_menu_1 QMenu"Options - 2"self );
        
self.sub_menu_1.addActionQAction('Opt 1-0'self) );
        
self.sub_menu_1.addActionQAction('Opt 1-1'self) );
        
self.sub_menu_1.addSeparator();
        
self.sub_menu_1.addActionQAction('Opt 1-2'self) );

        
self.sub_menu_0.addMenuself.sub_menu_1 );

        
self.popMenu.addMenuself.sub_menu_0 );

        
# QAction addAction (self, QIcon icon, QString text, callable receiver, QKeySequence shortcut = 0)

    # =================================================================
    
def on_context_menu(selfpoint):
        
# show context menu
        
self.popMenu.exec_self.mapToGlobal(point) );

        
# ---------------------------------------------------------

    # =================================================================
    
def delete_this_elemself ):

        
row self.currentRow();
        
self.takeItemrow );

    
# =================================================================
    
def add_new_elemself ):

        
ttl_items self.count();
        
self.addItem"new item: ["+str(ttl_items+1)+"]" );

    
# =================================================================
    
def event_handlerself ):
        print( 
"event_handler: ok" );


    
# =================================================================
    
def eventself_evt ):

        
# ----------------------------------------------------------
        # http://pyqt.sourceforge.net/Docs/PyQt4/qevent.html#Type-enum
        #print( _evt.type() );
        # ----------------------------------------------------------
        #if _evt.type() == QEvent.FocusOut:      # (QFocusEvent) == 9 == focus OUT BY CLICK
        #elif _evt.type() == QEvent.FocusIn:     # (QFocusEvent) == 8 == focus IN BY CLICK

        # ----------------------------------------------------------
        #if _evt.type() == QEvent.ContextMenu:   # (QContextMenuEvent) == 82

        # ----------------------------------------------------------
        #QEvent.MouseButtonDblClick  4   Mouse press again (QMouseEvent).
        #QEvent.MouseButtonRelease   3   Mouse release (QMouseEvent).
        #QPoint _evt.globalPos(); | int _evt.global[X|Y](); | QPoint _evt.pos(); | QPointF _evt.posF(); | int _evt.[x|y]()
        #_evt.button() == ( Qt.LeftButton | Qt.RightButton | Qt.MidButton )
        
if _evt.type() == QEvent.MouseButtonPress# 2   Mouse press (QMouseEvent).

            
self.L_BTN_CLICK False;
            
self.M_BTN_CLICK False;
            
self.R_BTN_CLICK False;

            
# *** print('_evt.type(): '+str(_evt.type())+' | _evt.button(): '+str(_evt.button()) );

            
if _evt.button() == Qt.LeftButton:
                
# *** print("Qt.LeftButton: "+str(Qt.LeftButton))
                
self.L_BTN_CLICK True;

            
elif _evt.button() == Qt.MidButton:
                
# *** print("Qt.MidButton: "+str(Qt.MidButton))
                
self.M_BTN_CLICK True;
            
            
elif _evt.button() == Qt.RightButton:
                
# *** print("Qt.RightButton: "+str(Qt.RightButton))
                
self.R_BTN_CLICK True;

        else:
            
# *** print('_evt.type(): '+str(_evt.type()) );
            
pass;

        
# ----------------------------------------------------------
        
if _evt.type() == QEvent.Enter:         # 10

            
self.setStyleSheetself.active );
            
self.HAS_FOCUS True;

        
elif _evt.type() == QEvent.Leave:       # 11 

            
self.setStyleSheetself.n_active );
            
self.HAS_FOCUS False;



        return 
QListWidget.event(self_evt);
        
# ----------------------------------------------------------

    # ================================================================= 
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 22.10.2016, 19:33   #5
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

PHP код:
# #####################################################################
class MainProgQWidget ):

    
# =================================================================
    
def __init__(selfparent=None):

        
# ---------------------------------------------------------
        
QWidget.__init__(selfparent);
        
self.setGeometry400100570380 );
        
self.setWindowTitle('Window Title');
        
#self.setStyleSheet( 'QWidget{ background: #333; color: #fff; }' );

        # ---------------------------------------------------------
        
self.qLWs = {}; # Все QListWidget
        
self.qLWs['length']   = 0;
        
self.qLWs['this_id']  = '0';
        
self.qLWs['this_row'] = 0;


        
self.qLWs['0_info'] = {}; 
        
self.qLWs['0_info']['descr'] = 'my descr [0]'
        
self.qLWs['0_info']['name'] = 'zero-name'

        
self.qLWs['0'] = MyListWidgetself, [1010340280] );
        
self.qLWs['0'].addItems( ['Aa_0','Bb_0','Cc_0'] );

        
self.connect
            
self.qLWs['0'], SIGNAL('itemSelectionChanged()'), 
            
lambdaself.qlistwidget_onSelect('0') );

        
self.qLWs['0'].itemClicked.connectlambdaself.qlistwidget_onSelect('0') );

        
self.qLWs['length'] += 1;

        
# ---------------------------------------------------------
        
self.qLWs['1_info'] = {}; 
        
self.qLWs['1_info']['descr'] = 'my descr [1]'
        
self.qLWs['1_info']['name'] = 'one-name'

        
self.qLWs['1'] = MyListWidgetself, [36010200280] );
        
self.qLWs['1'].addItems( ['Aa10','Bb10','Cc_1'] );

        
self.connect
            
self.qLWs['1'], SIGNAL('itemSelectionChanged()'), 
            
lambdaself.qlistwidget_onSelect('1') );

        
self.qLWs['1'].itemClicked.connectlambdaself.qlistwidget_onSelect('1') );

        
self.qLWs['length'] += 1;
        
# ---------------------------------------------------------

    # =================================================================
    
def qlistwidget_onSelectself_id ):

        for 
i in xrange(0self.qLWs['length'] ):
            
self.qLWsstr(i) ].setStyleSheetself.n_active );


        
self.qLWs_id ].setStyleSheetself.active );
        
val strself.qLWs_id ].currentItem().text() );
        
row self.qLWs_id ].currentRow();

        
self.qLWs['this_id'] = str_id );
        
self.qLWs['this_row'] = row;

        print(
"QListWidget: ID:["+_id+"] VAL: ["+val+"]; ROW: ["+str(row)+"]");
        print( 
self.qLWs[  _id+'_info']["name"], self.qLWs[  _id+'_info']["descr"] );

# ======================================================
if __name__ == "__main__":

    
app QApplication(sys.argv);

    
_MainProg MainProg();
    
_MainProg.show();

    
sys.exit(app.exec_()); 
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt кодировка в QListWidget troyan90 Qt и кроссплатформенное программирование С/С++ 2 13.05.2015 00:03
QListWidget расположение записей Farrel Qt и кроссплатформенное программирование С/С++ 5 09.06.2011 16:13
QListWidget и QDir для начинающих Farrel Qt и кроссплатформенное программирование С/С++ 1 28.04.2011 04:09
QListWidget как реагировать на добавление элемента Farrel Qt и кроссплатформенное программирование С/С++ 3 20.04.2011 23:33