2016-04-07 44 views
1

小さなアプリケーションを作成しようとしていて、行がドラッグ&ドロップされてもテーブルに影響を与えない行番号をどうにか "捕まえたい"。私は2つのファイルを作成しました。最初はQt Designerで基本GUI用に作成されたMainWindow UIファイルで、もう1つはQTableWidgetにいくつかのデータをレイアウトするコードがあります。テーブルを変更せずにドラッグ&ドロップQTableWidget

これは、ユーザーにドラッグアンドドロップの動きを示しても、ドロップされたときは何も変わらないことを表しています。私は他の投稿を読んだことがありますが、それらはすべてデータを移動したいと思われるので、これは何の助けも受けていません。

UiFile.py

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

# Form implementation generated from reading ui file 'UiFile.ui' 
# 
# Created: Thu Apr 7 21:07:11 2016 
#  by: PyQt4 UI code generator 4.11.2 
# 
# 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_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(763, 269) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.gridLayout = QtGui.QGridLayout(self.centralwidget) 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     self.tableWidget = QtGui.QTableWidget(self.centralwidget) 
     self.tableWidget.setDragEnabled(False) 
     self.tableWidget.setDragDropOverwriteMode(False) 
     self.tableWidget.setDragDropMode(QtGui.QAbstractItemView.DragDrop) 
     self.tableWidget.setDefaultDropAction(QtCore.Qt.ActionMask) 
     self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) 
     self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) 
     self.tableWidget.setObjectName(_fromUtf8("tableWidget")) 
     self.tableWidget.setColumnCount(7) 
     self.tableWidget.setRowCount(0) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(0, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(1, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(2, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(3, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(4, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(5, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(6, item) 
     self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 763, 24)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     item = self.tableWidget.horizontalHeaderItem(0) 
     item.setText(_translate("MainWindow", "Column 1", None)) 
     item = self.tableWidget.horizontalHeaderItem(1) 
     item.setText(_translate("MainWindow", "Column 2", None)) 
     item = self.tableWidget.horizontalHeaderItem(2) 
     item.setText(_translate("MainWindow", "Column 3", None)) 
     item = self.tableWidget.horizontalHeaderItem(3) 
     item.setText(_translate("MainWindow", "Column 4", None)) 
     item = self.tableWidget.horizontalHeaderItem(4) 
     item.setText(_translate("MainWindow", "Column 5", None)) 
     item = self.tableWidget.horizontalHeaderItem(5) 
     item.setText(_translate("MainWindow", "New Column", None)) 
     item = self.tableWidget.horizontalHeaderItem(6) 
     item.setText(_translate("MainWindow", "Column 7", None)) 

main.py

#!/usr/bin/env python 

import sys 

from PyQt4 import QtGui 
import UiFile 


class ExampleApp(QtGui.QMainWindow, UiFile.Ui_MainWindow): 

    def __init__(self, parent=None): 
     super(ExampleApp, self).__init__(parent) 
     self.setupUi(self) 
     self.home() 

    def home(self): 

     self.tableWidget.itemChanged.connect(self.my_item_changed_info) 

     self.add_row_to_ml_table("R1C1", "R1C2", "R1C3", "R1C4", "R1C5", "R1C6", "R1C7") 
     self.add_row_to_ml_table("R2C1", "R2C2", "R2C3", "R2C4", "R2C5", "R2C6", "R2C7") 
     self.add_row_to_ml_table("R3C1", "R3C2", "R3C3", "R3C4", "R3C5", "R3C6", "R3C7") 
     self.add_row_to_ml_table("R4C1", "R4C2", "R4C3", "R4C4", "R4C5", "R4C6", "R4C7") 
     self.add_row_to_ml_table("R5C1", "R5C2", "R5C3", "R5C4", "R5C5", "R5C6", "R5C7") 
     self.add_row_to_ml_table("R6C1", "R6C2", "R6C3", "R6C4", "R6C5", "R6C6", "R6C7") 
     self.add_row_to_ml_table("R7C1", "R7C2", "R7C3", "R7C4", "R7C5", "R7C6", "R7C7") 

    def add_row_to_ml_table(self, c1, c2, c3, c4, c5, c6, c7): 
     rowposition = self.tableWidget.rowCount() 
     self.tableWidget.insertRow(rowposition) 
     self.tableWidget.setItem(rowposition, 0, QtGui.QTableWidgetItem(c1)) 
     self.tableWidget.setItem(rowposition, 1, QtGui.QTableWidgetItem(c2)) 
     self.tableWidget.setItem(rowposition, 2, QtGui.QTableWidgetItem(c3)) 
     self.tableWidget.setItem(rowposition, 3, QtGui.QTableWidgetItem(c4)) 
     self.tableWidget.setItem(rowposition, 4, QtGui.QTableWidgetItem(c5)) 
     self.tableWidget.setItem(rowposition, 5, QtGui.QTableWidgetItem(c6)) 
     self.tableWidget.setItem(rowposition, 6, QtGui.QTableWidgetItem(c7)) 

    def my_item_changed_info(self, something): 
     if self.tableWidget.currentRow() != -1: 
      print("current", self.tableWidget.currentRow(), self.tableWidget.currentColumn()) 
      print(something.row(), something.column()) 

    def closeEvent(self, event): 
     choice = QtGui.QMessageBox.question(self, 'Xmms2 Skin', 'Do you want to quit the applictaion?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) 
     if choice == QtGui.QMessageBox.Yes: 
      event.accept() 
     else: 
      event.ignore() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = ExampleApp() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 

だから、私は何をする必要があるかドラッグされた行とある列の情報を取得することです落下している。

これを読んだことで、イベントをキャッチするためにQTableWidgetのサブクラスを作成する必要があります。

Qt Designerを使用してこれを行うことはできますか?私はプログラミングのスキルに基づいてこれを最初に選んだが、これははるかに複雑なGUIレイアウトの小さな断片である。

+0

私は新しいユーザーのために私の質問を編集することはできないと思うが、私はself.tableWidgetを使用することができます見つけた.____ class__ .dropEvent = self。 main.pyの15行目でtestfuncを実行してドロップイベントをキャッチしますが、行の取得方法を理解することはできません。 print(event.source()。row()を使用すると、TypeErrorが発生します。QTableWidget.row(QTableWidgetItem):引数が足りません。 – dave

答えて

0

私は家関数に

self.tableWidget.__class__.dropEvent = self.testdropfunc 

を追加することによって、それを自分自身を解決し、その後、testdropfuncは、次のようになります -

def testdropfunc(self, event): 
    moved_from = self.tableWidget.currentRow() 
    moved_to = self.tableWidget.rowAt(event.pos().y()) 
    print("Drop from " + str(moved_from) + " into row " + str(moved_to)) 
    event.accept() 

私は、これは実際にすべてとしては何も動かないことを実現します私は、アイテムの行情報( "ドラッグ"と "ドロップ")

関連する問題