Elemente in QListView eingrauen

Alles rund um die Programmierung mit Qt
Antworten
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Elemente in QListView eingrauen

Beitrag von autip »

Hallo!

Sagt mal, kann man in einer Listview auch Elemente eingrauen, ähnlich wie beim QPushButton über setEnabled(true/false)?

Ich hab bislang leider nur setRowHidden gefunden, womit man die Zeile komplett ausblendet.

Danke!
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ist da mit den Qt::ItemFlags nichts zu machen?
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Beitrag von autip »

Ja ich denk auch das sieht gar nicht so schlecht aus.
Jetzt ist nur die Frage, wie ich die flags für einzelne Elemente setze... Hatte noch nie mit den flags zu tun und Beispiel finde ich auch kein brauchbares.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Und ich hatte noch nie mit Models zu tun. Hättest Du ein ListWidget, könnte ich dir jetzt weiter helfen, aber ich habe keine Ahnung wie das mit QAbstractItemModel funktioniert.
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Beitrag von autip »

Schade :(


Die Zeilen müssen ja wahrscheinlich so ähnlich aussehen:

Element eingrauen:
......->setFlags(item->flags() & ~Qt::ItemIsEnabled)

Element wieder ausgrauen:
......->setFlags(item->flags() | Qt::ItemIsEnabled)


Jetzt ist nur die Frage, was ich statt "...." schreiben muss, um auf das gewünschte Element zugreifen zu können.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

also soweit ich weiß geht das bei dem Model und View zeugs anders...

vermutlich überlädst du ja die QAbstractItemModel Klassenfunktoinen in einer eigenen Klasse und greif stübe diese auf deinen Datenstrukturen zu. Jetzt musst du nur in der Funktionen flags ( ... ) dafür sorgen, dass die Datenstruktur zurückgibt welche flags zurückgegeben werden. Wie du die dann in deiner Datenstruktur änderst ist deine Sache...

Aber wie wär es damit: ( ich geje davon aus, dass DATENSTRUKTUR von QObject erbt)

Code: Alles auswählen

bool Models::IsEnabled ( )
{
// rückgegeben ob enabled
}

Qt::ItemFlags Model::flags ( const QModelIndex & index ) const
{
   if ( !index.isValid ( ) || index.internalPointer ( ) == NULL  )
      return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
   DATENSTRUKTUR *p_data ( qobject_cast < DATENSTRUKTUR* > ( index.internalPointer ( ) ) );

   if ( p_data != NULL && p_data->IsEnabled ( ) )
      return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
   return Qt::ItemIsSelectable;
}
Wenn du ein vorhandene Model-Klasse verwendest, würde ich stattdessen von dieser Klasse eine Klasse ableiten, die die flags Funktion überläd. Dann kannst du es ja zB so machen, dass du eine Liste erstellst in der drin tseht was deaktiviert ist u.


Ich geh aber davon aus, dass es auch leichter geht...

PS: Eine setFlags gibt es soweit ich weiß nicht, aber die kannst du ja für die überlade Klasse einbauen...
Glaube an eine Lösung, nur dann kannst du auch eine finden.
TimeForGold
Beiträge: 31
Registriert: 28. Januar 2007 14:27

Beitrag von TimeForGold »

Hat jemand mal einen einfacheren Weg herausgefunden um Einträge in einer QListView einzugrauen bzw. bestimmte Einträge farblich zu verändern (die Schrift oder den Hintergrund des Elementes)?

Mit besten Grüßen
TimeForGold
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann nimm halt ein QListWidget
TimeForGold
Beiträge: 31
Registriert: 28. Januar 2007 14:27

Beitrag von TimeForGold »

Ich verwende aber ein Modell im Hintergrund
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Ja mit den Flags in deinem Model kannst du auch bestimmte Elemente andere Flags geben.

z.B. nur Elemente der ersten Spalte bearbeitbar:

in Model::flags(const QModelIndex &index) const:

Code: Alles auswählen

if (index.column() == 0) {
  return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable
}

return Qt::ItemIsEnabled;

patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: Elemente in QListView eingrauen

Beitrag von patrik08 »

autip hat geschrieben:Hallo!

Sagt mal, kann man in einer Listview auch Elemente eingrauen, ähnlich wie beim QPushButton über setEnabled(true/false)?

Ich hab bislang leider nur setRowHidden gefunden, womit man die Zeile komplett ausblendet.

Danke!

Du kannst direkt ein QPushButton pushButton->setFlat(true); /* Flachen button */
und QMenu s dranmachen...

einfach die delegate zu list oder table machen....
Ich hatte eine editierbare tabelle und zwei kolonnen sind nicht zu editieren
darum habe ich profietiert um gleich einen flachen button reingeschrieben...

Mit den delegate muss man sich 2 tagen hinsetzen und testen ... dann aber spart man massenweise zeit...

Alles was von QWidget kommt kann man reinmachen ... mit editierbaren teil...

mit setAlternatingRowColors(true); kann man auch grau/weiss hindergrund haben....


Code: Alles auswählen


BaseDelegate::BaseDelegate( QTableView *ta , QObject *parent )
  :QSqlRelationalDelegate(parent)
{
  tas = ta;
}

void BaseDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
     if (index.column() == 11 || index.column() == 7 ) {
        QDateTimeEdit *dateEditor = qobject_cast<QDateTimeEdit *>(editor);
        if (dateEditor) {
            model->setData(index,dateEditor->date().toString("dd.MM.yyyy"));
        }
    } else if (index.column() == 0) {
        Base_Button *editorax = qobject_cast<Base_Button *>(editor);
          model->setData(index,editorax->GetNummer());
     } else {
        QItemDelegate::setModelData(editor, model, index);
    }
}


class Base_Button: public QWidget
{
    Q_OBJECT
//
public: 
    QPushButton *pushButton;

Base_Button( QWidget *parent )
: QWidget(parent)
{
    setAttribute(Qt::WA_WindowPropagation);
    QVBoxLayout *widgetLayout = new QVBoxLayout(this);
    widgetLayout->setMargin(0);
    widgetLayout->setSpacing(0);
    pushButton = new QPushButton(this);
    pushButton->setText(tr("Nr.0 Action"));
    pushButton->setCursor(QCursor(static_cast<Qt::CursorShape>(13)));
    pushButton->setFlat(true);   /* Flachen button */
    widgetLayout->addWidget(pushButton);
    
}
void SetNummer( int numero ) {
   identificativo = numero;
   pushButton->setText(tr("Nr.%1 Action").arg(identificativo)); 

   opeitema = new QAction(this);
   opeitema->setText(tr("Open Extended Edit.")); 
   connect(opeitema, SIGNAL(activated()), this,  SLOT(OpenFirst()));
    opeitemb = new QAction(this);
    QMenu *menu = new QMenu(this);
    menu->addAction(opeitema);
    pushButton->setMenu(menu);
}

int GetNummer() {
   return identificativo;
}
private:
    QAction *opeitema;
    int identificativo;
    QSize sizebase;
protected:
signals:
   void OpenItem( int ei );
public slots:
void  OpenFirst() {
  emit OpenItem(identificativo);
}

};

.........................
speack português italiano deutsch english castellà qt
TimeForGold
Beiträge: 31
Registriert: 28. Januar 2007 14:27

Beitrag von TimeForGold »

Ja mit den Flags in deinem Model kannst du auch bestimmte Elemente andere Flags geben.

z.B. nur Elemente der ersten Spalte bearbeitbar:

in Model::flags(const QModelIndex &index) const:
Code:
Muss ich die Funktion überschreiben?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wäre sinnvoll, außer du hast eine bessere Idee...
Antworten