2016-12-17 3 views
0

ファイルからのユーザーのリストをtablewidgetまたはtableviewの最初の行に挿入したいとします。私は現在、テーブルウィジェットで試しています。これまでのところ、コードはthis投稿からの回答を見た後に思いついたものです。基本的にイメージを見ると、私はそれを正確にやろうとしていますし、後でそのアクションを実行するためにokボタンを追加します。qtablewidgetまたはqtableviewの最初の列にファイルからデータを挿入するにはどうすればよいですか?

todo

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     QtGui.QWidget.__init__(self) 
     self.table = QtGui.QTableWidget(rows, columns, self) 
     self.table.setHorizontalHeaderItem(0, QtGui.QTableWidgetItem("Users")) 
     self.table.setHorizontalHeaderItem(1, QtGui.QTableWidgetItem("Delete User")) 
     self.table.setHorizontalHeaderItem(2, QtGui.QTableWidgetItem("Delete User and Home")) 
     self.table.verticalHeader().hide() 
     header = self.table.horizontalHeader() 
     header.setStretchLastSection(True) 
     for column in range(columns): 
      if column == 0: 
       with open("users") as input: 
        if input is not None: 
         users = input.readlines() 
        for line in users: 
         users = QtGui.QTableWidgetItem(line) 
         print line 
        input.close() 
      for row in range(rows): 
       if column % 3: 
        item = QtGui.QTableWidgetItem('%d' % column) 
        item.setFlags(QtCore.Qt.ItemIsUserCheckable | 
            QtCore.Qt.ItemIsEnabled) 
        item.setCheckState(QtCore.Qt.Unchecked) 
        self.table.setItem(row, column, item) 
     self.table.itemClicked.connect(self.handleItemClicked) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.table) 
     self._list = [] 

    def handleItemClicked(self, item): 
     if item.checkState() == QtCore.Qt.Checked: 
      print('"%s" Checked' % item.text()) 
      self._list.append(item.row()) 
      print(self._list) 
     else: 
      print('"%s" Clicked' % item.text()) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window(6, 3) 
    window.resize(400, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

だから、正確に問題は何ですか?コードは、あなたが期待していることをどれくらいまでしていませんか? – ImportanceOfBeingErnest

+0

'ifカラム== 0:'ブロックは私が期待していることをしません。 – answerSeeker

+0

(a)あなたのコードでは、Pythonの単語 'input'を変数名として使います。決してそれをしないでください! (b) 'users'をループし、' users'をそのループの 'QTableWidgetItem'に再割り当てします。その後、 'users'は決して再び使用されません。だから私はあなたが何を期待しているのか分からず、本当にあなたの期待について具体的にする必要があります。 "私はこのコードを....と期待している"のような文を書く。 – ImportanceOfBeingErnest

答えて

1
#How do I insert data from file in the first column of a qtablewidget or qtableview? 

#This is the example code for insert data to Qtablewidget 
#Please not the print result. I hope you can understand how to use columns and row values. 
#I used the input data from "dictionary variable - self.input". You can replace this input variable to your input data. 
#if any doubts regarding this below code, please let me know. 
#If your are not expecting this answer, sorry. 
#Thanks, Subin 

import sys 
from PyQt4 import QtGui 
from PyQt4 import QtCore 

class Window (QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 

     #Read user text file and append to dictionary variable   
     userDataPath  = 'C:/Users/Subin/Desktop/userList.txt'     
     readUserData  = open (userDataPath, 'r')   
     userList   = readUserData.readlines()   
     #self.input   = {'bruno':[0,1], 'shelly':[0,0], 'nobody':[1,1]}   
     self.input   = {} 

     for eachUser in userList : 
      if eachUser.strip() : 
       self.input.setdefault (eachUser.strip(), [1, 1])    

     self.rows   = 3 
     self.columns  = len(self.input)   

     self.tableWidget = QtGui.QTableWidget (self)   
     self.tableWidget.setGeometry (QtCore.QRect(10, 10, 500, 180)) 
     self.tableWidget.setObjectName ('tableWidget') 
     self.tableWidget.setColumnCount(self.rows) 
     self.tableWidget.setRowCount(self.columns)   

     print '\t\tcolumns rows\n'   
     cLoop  = 0 
     for eachInput in self.input :   
      self.item_name  = QtGui.QTableWidgetItem() 
      self.tableWidget.setItem (cLoop, 0, self.item_name) 
      self.item_name.setText (eachInput)    
      print 'name\t\tcolumns ', cLoop, ' rows ', 0 

      rLoop = 0 
      for eachAttri in self.input[eachInput] :     
       self.item_attri  = QtGui.QTableWidgetItem()     
       self.tableWidget.setItem (cLoop, rLoop+1, self.item_attri)         
       self.item_attri.setFlags (QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsEnabled) 

       self.item_attri.setCheckState (QtCore.Qt.Unchecked)         
       if eachAttri==1 : 
        self.item_attri.setCheckState (QtCore.Qt.Checked)     
       print 'attributes\tcolumns ', cLoop, ' rows ', rLoop+1     
       rLoop+=1 

      cLoop+=1     
      print '\n'   

if __name__=='__main__': 
    app  = QtGui.QApplication(sys.argv) 
    wind = Window() 
    wind.show() 
    sys.exit(app.exec_()) 
+0

これはまさに私が望むものですが、ユーザーはファイルから来る必要があります。どのように 'self.input'を各行にユーザが入っているファイルに翻訳できますか?私は非常に多くの質問が残念ですが、私はまだ一般的な初心者です。 – answerSeeker

+0

前のコードを更新しました。一度確認してください。私はあなたがこれを期待していると思う。このコードに関する疑問があれば教えてください。 あなたがこの回答を期待していない場合は、ごめんなさい。 –

1

次のコードは、あなたが必要なものを行うことができます。それはあなたがそのファイルを読み込み、改行文字を取り除く必要がある

Harry 
Sally 
Wang 
Jon 
Leona 

のように、あなたは行ごとに1名で構成されたファイルusers.txtを、持っていることを前提としています。

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     with open("users.txt") as f: 
      users = f.readlines() 
      users = [user.split("\n")[0] for user in users] 

     self.table = QtGui.QTableWidget(len(users), 2, self) 
     self.table.setHorizontalHeaderLabels(["Delete User", "Delete Home"]) 
     self.table.setVerticalHeaderLabels(users) 
     for column in range(2): 
      for row in range(len(users)): 
       item = QtGui.QTableWidgetItem("") 
       item.setFlags(QtCore.Qt.ItemIsUserCheckable | 
            QtCore.Qt.ItemIsEnabled) 
       item.setCheckState(QtCore.Qt.Unchecked) 
       self.table.setItem(row, column, item) 
     self.table.itemClicked.connect(self.handleItemClicked) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.table) 
     self._list = [] 

    def handleItemClicked(self, item): 
     if item.checkState() == QtCore.Qt.Checked: 
      print('"%s" Checked' % item.text()) 
      self._list.append(item.row()) 
      print(self._list) 
     else: 
      print('"%s" Clicked' % item.text()) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.resize(350, 300) 
    window.show() 
    sys.exit(app.exec_()) 
+0

私はまだそれをデバッグしようとしていない、あなたのコードをコンパイルしますが実行されません。 – answerSeeker

+0

「コンパイルしても実行しない」とはどういう意味ですか? Pythonコードをコンパイルする必要はありません。それは私のマシン上で動作します。同じディレクトリに 'users.txt'という名前のファイルがあるという条件の下では、あなたのために実行されるはずです。実行に問題がある場合は、その問題についてより具体的に説明する必要があります。 – ImportanceOfBeingErnest

+0

私の間違いは、私はもう一度それを実行し、動作します。私は 'sys.exit(app.exec _())を初めてコピーしていないと思います。私はそれは走ったが、何も起こらなかったことを意味した。私はJavaのバックグラウンドを持っているので、Javaプログラムが動作する方法を説明しようとしました。助けてくれてありがとう。 – answerSeeker

関連する問題