Einen Renderer für Komponenten (ComboBox, List, etc...)

Alles rund um die Programmierung mit Qt
Antworten
Sym
Beiträge: 139
Registriert: 15. Mai 2006 15:38
Wohnort: Bremen

Einen Renderer für Komponenten (ComboBox, List, etc...)

Beitrag von Sym »

Hallo,

von Java bin ich es gewohnt, für Comboxen, Listen, etc einen Renderer schreiben zu können. Das heißt, ich fülle die Komponente mit Objekten und der Renderer sagt der Komponente, wie sie das Objekt anzuzeigen hat (rendern).

Für Qt habe ich solch eine Möglichkeit bisher nicht gesehen. Wie gebe ich z.B. einer ComboBox ein Objekt und sage ihr, wie sie es zeichnen soll?

Gruß Lars
Sym
Beiträge: 139
Registriert: 15. Mai 2006 15:38
Wohnort: Bremen

Beitrag von Sym »

Gibt es diese Möglichkeit gar nicht? Muss ich immer Strings übergeben?
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

Kannst du bitte mal Java-Beispiel-Code posten, damit ich weiß, was du meinst? Ich hab' zwar schon mit MVC in Java gearbeitet aber von diesem Rendering habe ich noch nichts gehört.

MfG, Cedric
Sym
Beiträge: 139
Registriert: 15. Mai 2006 15:38
Wohnort: Bremen

Beitrag von Sym »

Aber klar:

Code: Alles auswählen

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboBoxTest {
    public static void main(final String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComboBox box = new JComboBox();
        frame.getContentPane().add(box);

        box.addItem(Color.BLACK);
        box.addItem(Color.BLUE);
        box.addItem(Color.RED);

        box.setRenderer(new ColorRenderer());
        box.setPreferredSize(new Dimension(150, 18));
        box.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                System.out.println(((JComboBox) e.getSource())
                        .getSelectedItem());
            }
        });

        frame.pack();

        frame.setVisible(true);
    }
}
Diese Startklasse erzeugt eine Combobox, die Farben anzeigen soll. Der Renderer würde entsprechend so aussehen

Code: Alles auswählen

public class ColorRenderer extends JLabel implements ListCellRenderer {

    /**
     * Generated serial version.
     */
    private static final long serialVersionUID = 7865281848578121702L;

    /**
     * Constructor.
     */
    public ColorRenderer() {
        setOpaque(true); // do not rely on look and feel default settings
    }

    /**
     * {@inheritDoc}
     */
    public final Component getListCellRendererComponent(final JList list,
            final Object value, final int index, final boolean isSelected,
            final boolean cellHasFocus) {

        String text = "  ";

        if (value instanceof Color) {
           
            Color color = (Color) value;
           
            setBackground(color);
            setForeground(color);
           
        }
       
        setText(text);
        setFont(list.getFont());

        return this; // label is done, return
    }
}
Ich habe also ein anzeigendes Objekt (Combobox, Liste, Tree, etc...) und diese wird mit Objekte gefüllt. Der Renderer zeigt dann, wie das Objekt im Tree, etc... angezeigt wird.

Wie kann ich ein Objekt in eine anzeigende Komponente hängen und der dann mitteilen, was sie schreiben/zeichnen soll?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Könnte es sein, daß du Modelle meinst?
Sym
Beiträge: 139
Registriert: 15. Mai 2006 15:38
Wohnort: Bremen

Beitrag von Sym »

Ja, ich meine auch Modelle. Doch wo finde ich die?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

In der Dokumenatation?

QAbstractItemModel
QAbstractListModel
QAbstractProxyModel
QAbstractTableModel
QDirModel
QProxyModel
QStandardItemModel
QStringListModel
QSortFilterProxyModel
QSqlQueryModel
Antworten