Seite 1 von 1

Elemente in QListView eingrauen

Verfasst: 10. März 2006 00:49
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!

Verfasst: 10. März 2006 07:13
von macman
Ist da mit den Qt::ItemFlags nichts zu machen?

Verfasst: 10. März 2006 12:55
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.

Verfasst: 10. März 2006 13:07
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.

Verfasst: 10. März 2006 13:18
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.

Verfasst: 10. März 2006 14:01
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...

Verfasst: 10. Mai 2007 12:01
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

Verfasst: 10. Mai 2007 12:31
von upsala
Dann nimm halt ein QListWidget

Verfasst: 10. Mai 2007 12:31
von TimeForGold
Ich verwende aber ein Modell im Hintergrund

Verfasst: 10. Mai 2007 12:58
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;


Re: Elemente in QListView eingrauen

Verfasst: 10. Mai 2007 13:36
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);
}

};


Verfasst: 15. Mai 2007 08:45
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?

Verfasst: 15. Mai 2007 09:12
von upsala
Wäre sinnvoll, außer du hast eine bessere Idee...