Elemente in QListView eingrauen
Elemente in QListView eingrauen
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!
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!
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.
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.
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)
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...
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;
}
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
-
TimeForGold
- Beiträge: 31
- Registriert: 28. Januar 2007 14:27
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:
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
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
speack português italiano deutsch english castellà qt
-
TimeForGold
- Beiträge: 31
- Registriert: 28. Januar 2007 14:27