Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение [RSS Feed]

#1 Март 25, 2017 15:36:20

buzzi
Зарегистрирован: 2015-05-17
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

При выделении протяжкой в QTableView сигнал ловится только если отпустить клавишу в той же ячейке с которой начиналось выделение. Или я что-то не так делаю… Подскажите как такую штуку правильно реализовать? Или можно как-то отлавливать сигнал выделения каждой из ячеек?

 # -*- coding: utf-8 -*-
import operator
import sys
from PyQt4 import QtCore, QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)
class Model(QtCore.QAbstractTableModel):
    def __init__(self, cached_data, parent=None, *args):
        QtCore.QAbstractTableModel.__init__(self, parent, *args)
        self.colLabels = (u'№ 1', u'№ 2', u'№ 3')
        self.cached = cached_data
    def rowCount(self, parent):
        return len(self.cached)
    def columnCount(self, parent):
        return len(self.colLabels)
    def data(self, index, role):
        if not index.isValid():
            return QtCore.QVariant()
        elif role != QtCore.Qt.DisplayRole and role != QtCore.Qt.EditRole:
            return QtCore.QVariant()
        row = index.row()
        col = index.column()
        return QtCore.QVariant(self.cached[row][col])
    def headerData(self, section, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return QtCore.QVariant(self.colLabels[section])
        return QtCore.QVariant()
    def sort(self, Ncol, order):
        self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()"))
        self.cached = sorted(self.cached, key=operator.itemgetter(Ncol))
        if order == QtCore.Qt.DescendingOrder:
            self.cached.reverse()
        self.emit(QtCore.SIGNAL("layoutChanged()"))
        
        
class Ui_mainWindow(object):
    def setupUi(self, mainWindow):
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("cleanlooks"))
        mainWindow.setObjectName(_fromUtf8("mainWindow"))
        mainWindow.setToolTip(_fromUtf8(""))
        mainWindow.resize(520, 520)
        self.centralwidget = QtGui.QWidget(mainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.centralwidget.setGeometry(QtCore.QRect(10, 10, 500, 500))
        self.tableView_income = QtGui.QTableView(self.centralwidget)
        self.tableView_income.setObjectName(_fromUtf8("tableView_income"))
        self.tableView_income.setGeometry(QtCore.QRect(10, 10, 500, 500))
        self.tableView_income.setSortingEnabled(True)
        self.model_income = Model([(1,2,3),
                                  (4,5,6),
                                  (7,8,9)])
        self.tableView_income.setModel(self.model_income)
        self.tableView_income.resizeColumnsToContents()
        self.tableView_income.clicked.connect(self.summ_calc)
    def summ_calc(self):
        self.clear_tips((self.tableView_income,))
        tables_models = ((self.tableView_income, self.model_income),)
        answer = []
        for i in tables_models:
            if i[0].hasFocus():
                for j in i[0].selectedIndexes():
                    answer.append(float(i[1].data(j, 0).toString()))
                i[0].setToolTip(u'Сумма: %.2f' % float(sum(answer)))
                print answer
    def clear_tips(self, obj_list):
        for i in obj_list:
            i.setToolTip(u'Сумма: 0.00')
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_mainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Отредактировано buzzi (Март 25, 2017 15:45:41)

Офлайн

#2 Март 25, 2017 16:30:13

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

QTableView.selectionChanged()
QWidget.mouseReleaseEvent()

Отредактировано vic57 (Март 25, 2017 16:32:14)

Офлайн

#3 Март 25, 2017 16:50:22

buzzi
Зарегистрирован: 2015-05-17
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

Спасибо, огромное, не докурил доки…

Если кому-то менее очевидно что нужно сделать - работающий код ниже.

 # -*- coding: utf-8 -*-
import operator
import sys
from PyQt4 import QtCore, QtGui
from PyQt4 import QtWebKit
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)
class Model(QtCore.QAbstractTableModel):
    def __init__(self, cached_data, parent=None, *args):
        QtCore.QAbstractTableModel.__init__(self, parent, *args)
        self.colLabels = (u'№ 1', u'№ 2', u'№ 3')
        self.cached = cached_data
    def rowCount(self, parent):
        return len(self.cached)
    def columnCount(self, parent):
        return len(self.colLabels)
    def data(self, index, role):
        if not index.isValid():
            return QtCore.QVariant()
        elif role != QtCore.Qt.DisplayRole and role != QtCore.Qt.EditRole:
            return QtCore.QVariant()
        row = index.row()
        col = index.column()
        return QtCore.QVariant(self.cached[row][col])
    def headerData(self, section, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return QtCore.QVariant(self.colLabels[section])
        return QtCore.QVariant()
    def sort(self, Ncol, order):
        self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()"))
        self.cached = sorted(self.cached, key=operator.itemgetter(Ncol))
        if order == QtCore.Qt.DescendingOrder:
            self.cached.reverse()
        self.emit(QtCore.SIGNAL("layoutChanged()"))
        
        
class Ui_mainWindow(object):
    def setupUi(self, mainWindow):
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("cleanlooks"))
        mainWindow.setObjectName(_fromUtf8("mainWindow"))
        mainWindow.setToolTip(_fromUtf8(""))
        mainWindow.resize(520, 520)
        self.centralwidget = QtGui.QWidget(mainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.centralwidget.setGeometry(QtCore.QRect(10, 10, 500, 500))
        self.tableView_income = QtGui.QTableView(self.centralwidget)
        self.tableView_income.setObjectName(_fromUtf8("tableView_income"))
        self.tableView_income.setGeometry(QtCore.QRect(10, 10, 500, 500))
        self.tableView_income.setSortingEnabled(True)
        self.model_income = Model([(1,2,3),
                                  (4,5,6),
                                  (7,8,9)])
        self.tableView_income.setModel(self.model_income)
        self.tableView_income.resizeColumnsToContents()
        """
        Меняем сигнал на такой:
        self.tableView_income.selectionModel().selectionChanged.connect(self.summ_calc)
        либо создаем объект вида
        self.sel_model = self.tableView_income.selectionModel()
        и подвязываем к нему connect
        self.sel_model.connect(self.summ_calc)
        """
        self.tableView_income.selectionModel().selectionChanged.connect(self.summ_calc) 
    def summ_calc(self):
        tables_models = ((self.tableView_income, self.model_income),)
        answer = []
        for i in tables_models:
            if i[0].hasFocus():
                for j in i[0].selectedIndexes():
                    answer.append(float(i[1].data(j, 0).toString()))
                i[0].setToolTip(u'Сумма: %.2f' % float(sum(answer)))
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_mainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Отредактировано buzzi (Март 25, 2017 17:27:35)

Офлайн

#4 Март 25, 2017 17:01:58

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

вообще лучше это делать по ПКМ через contextMenuEvent()

Офлайн

#5 Март 25, 2017 17:19:18

buzzi
Зарегистрирован: 2015-05-17
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

Ну данных там будет не много максимум строк 50, так что нагрузка будет не большой, если это имелось ввиду? или есть другие причины?

Офлайн

#6 Март 25, 2017 17:27:27

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

buzzi
Ну данных там будет не много максимум строк 50, так что нагрузка будет не большой, если это имелось ввиду? или есть другие причины?
def selectionChanged(...):
print 'select'
слот будет вызываться при каждом изменении

Офлайн

#7 Март 25, 2017 17:32:14

buzzi
Зарегистрирован: 2015-05-17
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение

Да, точно, есть такое

Офлайн

  • Начало
  • » GUI
  • » PyQt ловит сигнал clicked() только в той ячейке с которой начиналось выделение[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version