Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-QTableWidget.selectedRanges()在选择时返回多个范围_Python_Qt_Multiple Columns_Qtablewidget - Fatal编程技术网

Python-QTableWidget.selectedRanges()在选择时返回多个范围

Python-QTableWidget.selectedRanges()在选择时返回多个范围,python,qt,multiple-columns,qtablewidget,Python,Qt,Multiple Columns,Qtablewidget,我是python新手,开发了一个带有表的GUI。应该可以通过上下文菜单连接行和列。这是有效的。 我可以使用ctrl+鼠标左键单击选择多行 但是表中有一个或多个span is/are,我想添加更多,QTableWidget.selectedRanges()如果选择nXm选择,则返回n*mselectionRanges。 例如,如果我在一列中选择了3行,则有3个selectionRanges 在控制台上写了3次 QTableView::setSpan: single cell span won't

我是python新手,开发了一个带有表的GUI。应该可以通过上下文菜单连接行和列。这是有效的。 我可以使用ctrl+鼠标左键单击选择多行

但是表中有一个或多个span is/are,我想添加更多,QTableWidget.selectedRanges()如果选择nXm选择,则返回n*mselectionRanges。 例如,如果我在一列中选择了3行,则有3个selectionRanges

在控制台上写了3次

QTableView::setSpan: single cell span won't be added 
已安装Python 2.7.5+

谢谢,再见

于2014年3月17日编辑

这是我的小程序的完整代码

程序.py

import sys
from PyQt4 import QtGui, QtCore
from tableGui import Ui_Dialog as Dlg


class MarkDownTableGui(QtGui.QDialog,Dlg):
  def __init__(self):
    QtGui.QDialog.__init__(self)
    self.setupUi(self)
    ColumnCount = None
    ColumnRow = None    
    # Context menu connect cell/reset connected/selected cells
    self.menu = QtGui.QMenu()           
    self.menu.addAction("Connect",self.addSpan)
    self.menu.addAction("Reset",self.resetConnected)     

    self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)

    self.customContextMenuRequested.connect(self.showContextMenu)            
    self.connect(self.generateButton,QtCore.SIGNAL("clicked()"),self.onGenerate)

  def onGenerate(self):    
    """
      Generate a m x n table
    """
    self.tableWidget.setRowCount(self.RowCount.value())
    self.tableWidget.setColumnCount(self.ColumnCount.value())

  def addSpan(self):    
    selectedElements = self.tableWidget.selectedRanges()       

    for slrange in selectedElements:      
      self.tableWidget.setSpan(slrange.topRow(),slrange.leftColumn(),slrange.rowCount(),slrange.columnCount())  


  def showContextMenu(self,pos):             
    self.menu.exec_(QtGui.QCursor.pos())    

  def resetConnected(self):
    #TODO
    print "TODO"


app = QtGui.QApplication(sys.argv)
dialog = MarkDownTableGui()
dialog.show()
sys.exit(app.exec_())
这是由pyuic4生成的tableGui.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'dialog_Table.ui'
#
# Created: Mon Mar 17 08:59:43 2014
#      by: PyQt4 UI code generator 4.10.3
#
# WARNING! All changes made in this file will be lost!

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 Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
        Dialog.resize(509, 426)
        Dialog.setModal(True)
        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(140, 370, 341, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
        self.ColumnCount = QtGui.QSpinBox(Dialog)
        self.ColumnCount.setGeometry(QtCore.QRect(90, 10, 51, 23))
        self.ColumnCount.setMinimum(1)
        self.ColumnCount.setProperty("value", 5)
        self.ColumnCount.setObjectName(_fromUtf8("ColumnCount"))
        self.labelChapterCount = QtGui.QLabel(Dialog)
        self.labelChapterCount.setGeometry(QtCore.QRect(10, 10, 74, 23))
        self.labelChapterCount.setObjectName(_fromUtf8("labelChapterCount"))
        self.RowCount = QtGui.QSpinBox(Dialog)
        self.RowCount.setGeometry(QtCore.QRect(250, 10, 51, 23))
        self.RowCount.setMinimum(1)
        self.RowCount.setProperty("value", 5)
        self.RowCount.setObjectName(_fromUtf8("RowCount"))
        self.labelChapterCount_2 = QtGui.QLabel(Dialog)
        self.labelChapterCount_2.setGeometry(QtCore.QRect(160, 10, 74, 23))
        self.labelChapterCount_2.setObjectName(_fromUtf8("labelChapterCount_2"))
        self.generateButton = QtGui.QPushButton(Dialog)
        self.generateButton.setGeometry(QtCore.QRect(340, 10, 111, 24))
        self.generateButton.setObjectName(_fromUtf8("generateButton"))
        self.tableWidget = QtGui.QTableWidget(Dialog)
        self.tableWidget.setGeometry(QtCore.QRect(0, 40, 491, 321))
        self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(5)
        self.tableWidget.setObjectName(_fromUtf8("tableWidget"))

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Table editor", None))
        self.labelChapterCount.setText(_translate("Dialog", "Column", None))
        self.labelChapterCount_2.setText(_translate("Dialog", "Rows", None))
        self.generateButton.setText(_translate("Dialog", "generate Table", None))
问题

  • 如果程序正在运行,您可以按住鼠标左键选择单元格
  • 单击鼠标左键打开关联菜单
  • 选择“连接”,创建列/行范围
  • 如果要添加其他跨距并从点1开始。然后我又得到了消息

    QTableView::setSpan:将不添加单个单元格范围


  • 问题是为什么selectedRanges()返回一个包含n个selectionRanges的列表,而不是只返回selectionRange上的列表。我已经阅读了和的文档。但是没有任何想法

    表中的跨单元格似乎改变了选择模型构造其选择范围的方式。我不知道这到底是为什么,但即使这没有发生,也不会消除所有的问题

    默认情况下,表格小部件允许多个选择,因此您可以以无法跨越(作为一个整体)的选择结束。但即使多个选择彼此相邻并形成一个可以跨越的块,选择模型也将始终将这些记录为选择范围列表,而不是将它们全部合并到单个选择中

    因此,为了使其正常工作,我认为在允许设置范围之前,您必须切换到不同的选择模式。最好的选择似乎是:

        self.tableWidget.setSelectionMode(
            QtGui.QAbstractItemView.ContiguousSelection)
    
    仅允许选择单个矩形块。您可能需要一个按钮在不同的选择模式之间切换,并根据需要禁用“连接”菜单项

    这仍然留下了在设置第一个跨度后处理选择范围列表的问题。要解决此问题,可以执行以下操作:

        def addSpan(self): 
            selection = list(self.tableWidget.selectionModel().selection())
            selection.sort()
            top = selection[0].top()
            left = selection[0].left()
            bottom = selection[-1].bottom()
            right = selection[-1].right()
            self.tableWidget.setSpan(
                top, left, bottom - top + 1, right - left + 1)
    

    我不确定是否确实需要对选择进行排序,但这确实保证了选择范围始终按正确的顺序排列。

    您能澄清您的问题吗?从你迄今为止提供的信息很难判断问题是什么,或者你在问什么。我已经编辑了我最初的帖子。我希望它能提高人们对这个问题的理解。