Seite 1 von 1

[teils gelöst] QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 11:33
von Pixtar
Hiho,

ich habe mein Hauptprogramm (QWidget), welches bei einem bestimmten Event eine QTableWidget angezeigt. Diese Tabelle ist aber nicht das Kind vom Hauptprogramm!! (Eigenständiges Fenster, was im selben Prozess läuft)

Wenn ich in eine Zelle der Tabelle klicke, möchte ich den Fokus wieder auf das Hauptprogramm bekommen.
Die Methoden setFocus(), raise() oder lower() haben in den verschiedenen Kombinationen bisland nicht zum erfolg geführt.

Hat da jemand eine Idee?

Grüße Pixtar

PS: Ich sollte vielleicht noch erwähnen, dass das QTableWidget als Qt::Dialog mit dem Attribut Qt::WindowStaysOnTopHint geöffnet/angezeigt wird.

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 11:39
von slim10
hast du des auch mal mit SIGNALS und SLOTS ausprobiert?

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 11:54
von Pixtar
Verstehe deine Frage nicht ganz slim10 ... ob ich das nun über SIGNAL/SLOT löse oder die Methoden in Funktionen aufrufen, sollte (zumindest in meinen Gedankengang) keinen unterschied machen!

Sprich:
Ob so ...

Code: Alles auswählen

  connect(tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(selectCell(int,int)));
  [..]
  void Widget::selectCell(int x, int y){
    [..]
    this->setFocus();
  }
oder so ..

Code: Alles auswählen

  connect(tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(selectCell(int,int)));
  connect(tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(setFocus());
.. sollte das selbe sein!

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 12:02
von slim10
naja so wie du des geschrieben hast net ganz...

Code: Alles auswählen

connect(tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(setFocus());
ich denke das dieser connect nicht so funktionieren wird



wie hast du des gemacht? mit der Methode oder den 2 connects?

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 12:10
von Pixtar
Nach Methode 1 .. also nur den Connect auf die Methode und in der Methode halt die verschiedenen Funktionen ala raise(), setFocus() bzw. clearFocus() probiert!

PS: Solch ein Connect wie ich ihn angegeben habe, ist vollkommen i.O. - warum sollte der nicht funktionieren?!

Code: Alles auswählen

connect(tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(setFocus());
Soetwas geht in C++ auch:

Code: Alles auswählen

//Deklaration
void setXYZ();
[..]

//Definition
void setXYZ(){
//do something
}
[..]

int f=300;
setXYZ(f);

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 12:19
von franzf
Pixtar hat geschrieben: Soetwas geht in C++ auch:

Code: Alles auswählen

//Deklaration
void setXYZ();
[..]

//Definition
void setXYZ(){
//do something
}
[..]

int f=300;
setXYZ(f);
So etwas geht in C++ nicht! Die Signaturen müssen passen, setXYZ() und setXYZ(int) sind NICHT identisch!
Der connect geht aber, SLOTS dürfen weniger Argumente haben als die SIGNALS, wobei man nur "von rechts wegnehmen" darf, sig(int, int) und slot(int) passt, sig(int, int) und slot(QString) past nicht.

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 12:24
von Pixtar
Okay, franzf dann gehts halt nur bei den SIGNAL/SLOTS ... löst aber leider nicht mein Problem, gä ? ;)

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 12:48
von Pixtar

Code: Alles auswählen

[..]
    tableWidget->clearFocus();
    tableWidget->lower();
    this->raise();
    this->setFocus(Qt::ActiveWindowFocusReason);
    this->setFocus();
[..]
Alle zusammen ergeben auch keinerlei Erfolg ... :(

NACHTRAG: Da ich viele QTableWidgets habe, habe ich das Widget verwechselt ... :twisted:
tableWidget->lower(); funktioniert schon einmal (obwohl es Qt::WindowStaysOnTopHint) hat, es wird der "Z-Index" neugesetzt und es verschwindet hinter allen anderen Fenstern, ABER es will einfach nicht seinen Focus auf-/abgeben :evil:
Habe nun noch zusätzlich mit der focusPolicy herumgespielt, was aber auch nichts ändert ...

Re: QWidget's / setFocus() / raise() ?!

Verfasst: 11. August 2011 13:24
von Pixtar
Eine wirklich wirklich w i r k l i c h beknackte Methode um dieses Problem zu lösen:
(gehe davon aus, das Qt::WindowStaysOnTopHint hier das Hauptproblem ist)

Code: Alles auswählen

this->hide();
this->show();
Wer was anderes in petto hat - her damit ;)