Seite 1 von 1

Layoutnamen bzw. -Index ermitteln können

Verfasst: 23. Dezember 2008 17:07
von boesewicht
Hallo,

in meinem Dialog-Fenster kann ich die Position bestimmen, in der ich die Mouse geklickt habe. Dieses Dialog-Fenster beinhaltet mehrere Layouts.

Kann mir jemand sagen ob/wie ich herausfinden kann welches Layout (ein Name, IndexNummer, oder so) sich unter dann auf dieser Position befindet, wenn ich diese ermittelt habe?

Somit würde ich gerne jedes Layout gezielt, durch Tastendruck ein-/ausschalten können.

Verfasst: 23. Dezember 2008 18:20
von solarix
in meinem Dialog-Fenster kann ich die Position bestimmen, in der ich die Mouse geklickt habe
Ich nehme an, du überlädst in deiner Dialog-Klasse "mouseReleaseEvent(QMouseEvent *event)" oder so...
Kann mir jemand sagen ob/wie ich herausfinden kann welches Layout (ein Name, IndexNummer, oder so) sich unter dann auf dieser Position befindet, wenn ich diese ermittelt habe?
Wie wär's mit:

Code: Alles auswählen

  QLayout *layout = qobject_cast<QLayout*>(childAt(event->pos()));
  if (layout)
    layout->hide(); // disable.. or whatever...

Verfasst: 5. Januar 2009 14:44
von boesewicht
Danke für die Antwort, solarix.

Leider hilft mir das irgendwie nicht weiter. Ich bekomme für "Layout" immer nur NULL zurück. Mein Code schaut nun (grob) so aus:

Code: Alles auswählen

test::test(QWidget *parent):QDialog(parent)
{
    ....
    PushButton = new QPushButton(tr("&test"));
    layout->addWidget(PushButton, 0, 0);
    setLayout(layout);

    PushButton->installEventFilter(this);
    ...
}

bool test::eventFilter(QObject *watchedObj, QEvent *event)
{
    ...
    QLayout *findLayoutAtXY;
    findLayoutAtXY = qobject_cast<QLayout*>(childAt(mouseEvent->pos()));
    if (findLayoutAtXY)
    {
        // alles super
    }
    else
    {
        // nichts gefunden
    }
    ....
}

Verfasst: 5. Januar 2009 15:32
von upsala
Kein Wunder: childAt(...) liefert ja auch ein QWidget zurück und kein QLayout. Aber es gibt ja dann noch QWidget::layout()

Verfasst: 8. Januar 2009 14:42
von boesewicht
Gut, jetzt habe ich schon ein wenig mehr Übersicht über das ganze. Auf mein Widget kann ich nun zugreifen und es z.B. Ein-/Ausblenden. Wenn ich nun aber gerne dessen gesamtes Layout Ein-/Ausblenden möchte, habe ich versucht das Layout so zu erhalten:

Code: Alles auswählen

QLayout *childLayout = new QHBoxLayout;
childLayout = childWidget->layout();
In diesem Fall bekomme ich aber immer nur NULL zurück, obwohl ich es ganz normal im Konstruktor zu einem Layout zusammengefasst habe (welches dann wiederum mit anderen zu einem übergeordneten Layout zusammengefasst wird).

Code: Alles auswählen

todayLayout = new QHBoxLayout;
todayLayout->addWidget(todayLabel);
todayLayout->addWidget(todayLineEdit);

allLayout = new QVBoxLayout;
allLayout->addLayout(todayLayout);

Verfasst: 8. Januar 2009 14:46
von pfid
boesewicht hat geschrieben:Gut, jetzt habe ich schon ein wenig mehr Übersicht über das ganze. Auf mein Widget kann ich nun zugreifen und es z.B. Ein-/Ausblenden. Wenn ich nun aber gerne dessen gesamtes Layout Ein-/Ausblenden möchte, habe ich versucht das Layout so zu erhalten:

Code: Alles auswählen

QLayout *childLayout = new QHBoxLayout;
childLayout = childWidget->layout();
Wieso erzeugst du ein neues Layout-Objekt, wenn du dann doch lieber das von childWidget nimmst?

Verfasst: 8. Januar 2009 15:05
von boesewicht
Ich dachte ich brauche doch irgend eine Variable, der ich dann die vorhandene Layout-Adresse zuweisen kann? (also sozusagen eine Kopie erstellen)
Wenn die Memberfunktion aufrufe weiß ich ja schließlich nicht welches der Layouts/Widgets gerade gemeint ist.

childWidget ist in diesem Fall ein belibieges Widget, welches ich vorher durch die Position bestimmt habe.