[Qt4] Geeignete View mit bestimmten "Look&Feel"

Alles rund um die Programmierung mit Qt
Antworten
CryptKeeper
Beiträge: 2
Registriert: 11. Februar 2006 20:06
Kontaktdaten:

[Qt4] Geeignete View mit bestimmten "Look&Feel"

Beitrag von CryptKeeper »

Hi,

Ich beschäftige mich erst seit einigen Wochen mit Qt und als Einstieg wollte ich jetzt mal das unter Windows bekannte Programm "Mp3tag" mit Qt nachprogrammieren. (Um es auch unter Linux einsetzen zu können.)

Probleme bereitet mir allerdings das zentrale Widget für das Programm. Das ganze ist im Original Programm nämlich eine Listen Anzeige, die so aussieht:

Bild

Das Item/View Konzept von Qt 4 scheint ja zwar sehr flexibel zu sein, dafür allerdings auch umfangreich und etwas komplex. Von den 3 Standard Views schien mir in diesem Fall "QTableView" für die Aufgabe die geeignetste zu sein.

Mit "QTableWidget" habe ich jetzt zumindest mal ein paar Tests mit der ListView machen können. Aber irgendwie hat diese nicht so recht das "look&feel" wie die View im Originalprogramm:

z.B.

--> Zeilenüberschriften werden nicht benötigt
--> Zeilenhöhe (und -überschriften) standardmäßig zu groß bzw. vom Benutzer veränderbar

Außerdem möchte ich aus dem Originalprogramm folgendes Verhalten übernehmen:

--> Wenn ich auf eine Zelle doppelklicke, um den Text zu ändern, soll der gesamte Text markiert werden.
--> Wenn ich im Edit-Modus bin und Enter drücke, soll der Cursor eine Zeile weiter gehen und in dieser Zelle den Edit-Modus aktivieren.

Allgemein habe ich das Gefühl, dass die TableView eher für Tabellenkalkulation gedacht ist und deshalb für meine Zwecke etwas "überdimensioniert" ist.

Mit welchem Widget, komme ich möglichst nahe an das Look&Feel der originalen Anzeige? (Wer Mp3tag nicht kennt: Die Anzeige ist so ähnlich wie z.B. die Detail Anzeige im Windows-Dateiexplorer.) Kann eine ListView evtl. auch mehrere Spalten anzeigen? Oder z.B. die Zellen in einer TreeView editierbar machen? Die "Baumstruktur" kann man ja, wie ich gelesen habe ausblenden!?

Oder muss ich mir da eine komplett eigene View Programmieren? Als Qt Anfänger vieleicht nicht gerade trivial!?

TIA

CryptKeeper
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Kennst du das: Kid3
Timewarp
Beiträge: 23
Registriert: 4. November 2005 21:09
Wohnort: Deutschland

Beitrag von Timewarp »

Allgemein habe ich das Gefühl, dass die TableView eher für Tabellenkalkulation gedacht ist und deshalb für meine Zwecke etwas "überdimensioniert" ist.
Da hast du wohl das richtige Gefühl. Ich muss zugeben das ist bei QT etwas seltsam. In jeder anderen Bibl. würde das wohl Listview heißen aber ich denke was du suchst ist QTreeView. Mit

Code: Alles auswählen

setRootIsDecorated(false);
lässt sich dann wie die Funktion schon sagt die Decoration des Trees ausblenden. Was du dann eigentlich nur noch brauchst ist evtl. ein eigenes Delegate wegen dem Inplace-Editing.
CryptKeeper
Beiträge: 2
Registriert: 11. Februar 2006 20:06
Kontaktdaten:

Beitrag von CryptKeeper »

Hi,

erstmal Danke für die Hilfe! Mit den Stichworten bin ich in der Qt Dokumentation fündig geworden und konnte ein erstes Testprogramm erstellen. Eigentlich war ich sogar positiv überrascht: Ich brauchte nur ein "QStandardItemModel" mit Daten zu füllen und das ganze mit einem TreeView zu verbinden. Für das rudimentäre Inplace Editing brauchte ich noch nichteinmal ein eigenes Delegate!

Allerdings habe ich nun doch schwierigkeiten, das ganze an das bestimmte "Look&Feel" anzupassen:

1. Verhaltensweise der TreeView:

Wie oben schon berschrieben, sollen beim Editieren eines Items (während dem Inplace-Editing) auf bestimmte Aktionen reagiert werden: Beim bestätigen der Änderung mit Enter soll das Inplace-Editing in dieser Zeile beendet werden, und in der gleichen Spalte eine Zeile weiter das nächste Element editiert werden. Bzw. mit "Tab" soll in der gleichen Zeile die nächste Spalte aktiviert werden.

Meine Überlegungen das zu realisieren war bisher so: Die View müsste also auf Signale des Editors reagieren. Deshalb habe ich meine EditorFactory (siehe Problem weiter unten) etwas modifiziert:

Code: Alles auswählen

class CTagEditorFactory : public QItemEditorFactory
{
	private: CMP3TagView *m_view;
	public:
		CTagEditorFactory(CMP3TagView *view);
		virtual QWidget *createEditor(QVariant::Type type, QWidget * parent) const;
};

QWidget *CTagEditorFactory::createEditor(QVariant::Type type, QWidget * parent) const 
{
	QLineEdit *edit = new QLineEdit(parent);
	QObject::connect(edit, SIGNAL( returnPressed() ), m_view, SLOT( ItemPressedEnter() ) );

	return edit;
}

// Auszug aus Konstruktor von MP3TagView (abgeleitet von QTreeView)
QItemDelegate *delegate = new QItemDelegate;
CTagEditorFactory *factory = new CTagEditorFactory(this);

delegate->setItemEditorFactory(factory);
this->setItemDelegate(delegate);
Der definierte Slot ItemPressedEnter() wird aber scheinbar nie ausgeführt (die darin aufgerufene MessageBox bekomme ich zumindest mal nicht zu Gesicht). Aber wieso nicht? Bzw. wie könnte man das sonst lösen? Mein Testprogramm habe ich mal angehängt.

Zusazt: Hmm, ich habe gerade herausgefunden, dass wenn ich während dem Editing "Tab" drücke, die View eine Zeile weiter den Edit Modus betritt. Also eigentlich genau das Verhalten, was ich für "Enter" wünsche! Kann man das evtl. irgendwie ausnutzen?

2. Probleme mit dem Aussehen der View:

--> Ich finde die Zeilenhöhe der TreeView etwas zu klein. Zwischen den Zeilen hätte ich gerne etwas mehr Abstand. Wie könnte man das lösen?

--> Ich möchte wie in dem Screenshot einen einfachen Rahmen um den Editor haben. Mit dem Gedanken an diese schöne Rahmen-Tabelle der QFrame Klasse (http://doc.trolltech.com/4.0/qframe.html) habe ich mich also durch die Doku gelesen, wie ich beim Inplace Editing an das QLineEdit Objekt komme. (Um die Eigenschafen des Widgets zu ändern.) Ziemlich bald habe ich dann die Klasse "QItemEditorFactory" entdeckt und eine eigene Factory abgeleitet, bei der ich in der "createEditor" Methode das LineEdit an meine Wünsche anpassen konnte. (siehe Codeauschnitt von oben.) Tja, und an dieser Stelle musste ich dann leider feststellen, das QLineEdit garnicht wie gedacht von QFrame abgeleitet wurde. Ich kann also lediglich mit QLineEdit::setFrame(bool) den 3D Rahmen ein- und ausschalten.

Wie aber bekomme ich einen einfachen 2D Rahmen (wie Box & Plain bei QFrame) um die LineEdit?

Ich habe auch schon versucht eine LineEdit mit einem QFrame als Parent zu erstellen. Oder eine Mehrfachvererbung von QFrame und QLineEdit auf ein neues Widget. Hat aber beides leider nicht funktioniert!

Wie könnte ich das ganze Lösen? Die Probleme mit dem Aussehen sind eigentlich zweitrangig (zur Not könnte man sich daran auch gewöhnen.). Aber das Verhalten sollte schon wie gewünscht funktionieren!
upsala hat geschrieben:Kennst du das: Kid3
Tja, ich habe leider noch keinen Tag Editor für Linux gefunden, der so eine übersichtliche Tag Anzeige hat wie MP3Tag. Der Screenshot oben zeigt das ziemlich eindeutig: Ich habe alle Tags der Lieder des Ordners in einer Liste als übersicht. In vielen anderen TagEditoren sehe ich immer nur die Tags eines einzigen Liedes gleichzeitig.


TIA

CryptKeeper
Dateianhänge
mp3tagview.zip
(8.09 KiB) 182-mal heruntergeladen
Antworten