Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  2 906
Sitter og knoter med en oppgave i QT4. Det skal se slik ut:
http://dump.doomtech.net/.hidden/qt-app.tiff

Selve kodinga skal foregå i QT4/C++. Dataen skal være en person med navn, etternavn og klasse, som jeg tenker å lagre som en struct (eller et eller annet slags objekt) i en QList. I gridviewen merkes en hel eller flere rader av gangen. Denne delen er grei nok.

Det jeg er litt stuck med er hvordan dataen skal mates inn i grid viewen (tror det er det feltet til høyre kalles), og fikses på mest mulig elegant måte slik at ting kan slettes i QListen via den også. Har tittet på QTableWidget og QTableWidgetItem, problemet er stort sett at jeg da ender med å opprette tre objekter (QTableWidgetItem) pr. rad, en som har tekst fornavn, en som har tekst etternavn og en som har tekst klasse. Dette virker unødvendig kronglete, og jeg ser ikke helt hvordan jeg skal slette ting på en fornuftig måte om ting plutselig sorteres, uten å lage en jalla funksjon på det. Har også kikket på QTableView med modell QStandardItemModel og QStandardItem, uten å finne ut hvordan dette kan brukes i praksis for mitt person-objekt/struct.

Ber ikke om ferdig kode, men vil gjerne bli pekt i riktig retning for å få til dette. Har dillet frem og tilbake med QTableWidget og QTableView, men har bare endt opp med 500 linjer prøve-og-feile-kode hittil :>
QTableView skal nok være greit for dette.
Fikk knotet sammen en QTableView med sortering som fungerer som du kan se på.
Widgets er nok likt som på QT4/C++..
Det er nok signal-behandlingen det skiller seg.
Nå bruker jeg QT lite,det blir til at jeg bruker wxpython for den kjenner jeg veldig godt.

Når det gjelder og legge til data i celler fra bruker_input får du søke litt.
En mer vanlig struktur er at man laster data fra en database(SQL) til QTableView.
Men bør være greit og få det til fra bruker_input.
http://www.qtforum.org/article/21291...ew-record.html

Kode

import operator
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWindow(QWidget):
    def __init__(self, element_list, header, *args):
        QWidget.__init__(self, *args)
        # setGeometry(x_pos, y_pos, width, height)
        self.setGeometry(300, 200, 460, 300)
        self.setWindowTitle("Sorting PyQT's QTableView")

        self.header = header
        self.mydata = element_list
        # create table
        table = self.createTable()

        # use vbox layout
        layout = QVBoxLayout()
        layout.addWidget(table)
        self.setLayout(layout)

    def createTable(self):
        # create table view
        tview = QTableView()
        # set table model
        tmodel = MyTableModel(self, self.mydata, self.header)
        tview.setModel(tmodel)
        # set minimum size of table
        tview.setMinimumSize(400, 300)
        # hide grid with False
        tview.setShowGrid(False)
        # set font
        font = QFont("Courier New", 8)
        tview.setFont(font)
        # hide vertical header
        vh = tview.verticalHeader()
        vh.setVisible(False)
        # set horizontal header properties
        hh = tview.horizontalHeader()
        hh.setStretchLastSection(True)
        # set column width to fit contents
        tview.resizeColumnsToContents()
        # set all row heights
        nrows = len(self.mydata)
        for row in range(nrows):
            tview.setRowHeight(row, 18)
        # enable sorting
        tview.setSortingEnabled(True)
        return tview

class MyTableModel(QAbstractTableModel):
    def __init__(self, parent, mydata, header, *args):
        """
        mydata is list of tuples
        header is list of strings
        tuple length has to match header length
        """
        QAbstractTableModel.__init__(self, parent, *args)
        self.mydata = mydata
        self.header = header

    def rowCount(self, parent):
        return len(self.mydata)

    def columnCount(self, parent):
        return len(self.mydata[0])

    def data(self, index, role):
        if not index.isValid():
            return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()
        return QVariant(self.mydata[index.row()][index.column()])

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return QVariant(self.header[col])
        return QVariant()

    def sort(self, col, order):
        """sort table by given column number col"""
        self.emit(SIGNAL("layoutAboutToBeChanged()"))
        self.mydata = sorted(self.mydata,
            key=operator.itemgetter(col))
        if order == Qt.DescendingOrder:
            self.mydata.reverse()
        self.emit(SIGNAL("layoutChanged()"))

# Hedader top data
header = ['  First Name  ', '  Last Name  ', ' Class ', ]
     
# Use numbers for numeric data to sort properly
element_list = [
('Per', 'Hansen', '10d'),
('Ola', 'Normann', '10a'),
('Gunnar', 'Larsen', '10c'),
]

app = QApplication(sys.argv)
win = MyWindow(element_list, header)
win.show()
sys.exit(app.exec_())
http://bildr.no/thumb/581708.jpeg
Sist endret av snippsat; 4. februar 2010 kl. 13:03.
Takk for input, jeg satt og vurderte SQL selv, men dette skal primært være en lokal liste av noe slag. Har trålet gjennom eksempelet ditt og ser du lager en custom modell til QTableView. Greit nok, eneste jeg ikke helt greier å lese ut fra koden er hvor dataen lastes inn i QTableView til slutt. Ser at self.mydata sendes som argument til konstruktøren til modellen din, men etter det er jeg lost. Selve oppgaven ligger her. Bruk av tuples blir også litt knotete i C++ mtp. at det ikke er innebygget (såvidt jeg ser). Tenkte hovedsakelig å holde persondataen til struct/objekt med public måter å få ut navn, etternavn og klasse på.

Oppgaven er løst, så det ordnet seg :>
http://pastebin.com/f4f9852b5
Inneholder main.cpp, mainwindow.h, mainwindow.cpp, student.h og student.cpp.

Det jeg endte med å gjøre var å lage en QTableWidget, med properties slik at en og en linje ble merket av gangen. Lagrer Student-objekter i QList students. For å legge til noe i QTableWidget lager jeg en ny rad på toppen, og så lages det tre QTableWidgetItem (en for hver kolonne), med teksten fra variablene firstname, lastname og class i det nye student-objektet. Student-objektet legges i en QVariant og puttes i QTableWidgeten sitt data-felt. Samtidig legges Student-objektet til QListen i bakgrunnen.

Sletting blir en simpel affære med QTableWidget::currentRow(), kombinert med at Student-objektet alltid ligger i kolonne 0. Da er det bare å nappe det ut (med en ganske finurlig kodesnutt siden den skal hentes ut av både en QTableWidget og en QVariant), og bruke den med QList::removeOne()-funksjonen. removeOne fjerner i dette tilfellet første objekt som matcher det man putter inn som parameter, og det passer egentlig ypperlig.

Nå gjenstår det bare å gjøre ferdig ekstraoppgavene, med fillagring og sortering :>

(Koden leses/brukes på eget ansvar, jeg tar ikke skyld for evt. utrevne øyne eller oppkast som resultat av uprofesjonell kode).

// Hirr, forumet slår sammen poster selv om det går så lang tid i mellom ja.. :>

//Edit2: Skulle være med en “studentTable->setSortingEnabled(true);” i mainwindow.cpp der, sånn at sortering funker.
Sist endret av Nichotin; 4. februar 2010 kl. 13:54.