Seite 1 von 1

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

Verfasst: 2. Oktober 2006 01:04
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

Verfasst: 3. Oktober 2006 10:42
von Sym
Gibt es diese Möglichkeit gar nicht? Muss ich immer Strings übergeben?

Verfasst: 3. Oktober 2006 11:31
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

Verfasst: 3. Oktober 2006 15:20
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?

Verfasst: 3. Oktober 2006 20:07
von upsala
Könnte es sein, daß du Modelle meinst?

Verfasst: 3. Oktober 2006 20:55
von Sym
Ja, ich meine auch Modelle. Doch wo finde ich die?

Verfasst: 4. Oktober 2006 08:55
von upsala
In der Dokumenatation?

QAbstractItemModel
QAbstractListModel
QAbstractProxyModel
QAbstractTableModel
QDirModel
QProxyModel
QStandardItemModel
QStringListModel
QSortFilterProxyModel
QSqlQueryModel