QProgressDialog

Alles rund um die Programmierung mit Qt
Antworten
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

QProgressDialog

Beitrag von sooofunky »

Hallo,

habe ein QProgressDialog und möchte, dass der Benutzer während des Ladevorgangs auch nichts anderes machen kann. Mit setModal passt das auch. Leider gibt es die Möglichkeit ein Kontextmenü am QProgressDialog zu öffnen mit dem ich die Applikation zb. minimieren kann. Wie kann ich das ausschalten? Ich möchte nur den QProgressDialog zeigen und den Cancel Button erlauben. In der Dokumentation habe ich dazu nicht viel gefunden.

Vielen Dank
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: QProgressDialog

Beitrag von Exasperation »

Einen eigenen progress dialog machen, der von QProgressDialog erbt. (oder nen eigenen modalen Dialog mit Cancel-Button machen)
Anpassungen:
  • setWindowFlags( Qt::FramelessWindowHint )
  • setContextMenuPolicy( Qt::NoContextMenu )
Habs nicht getestest, aber könnte das bringen was du möchtest. Der Benutzer hat dann nur noch die Möglichkeit über den Cancel-Button den Vorgang abzubrechen.
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: QProgressDialog

Beitrag von sooofunky »

setContextMenuPolicy( Qt::NoContextMenu )
Habe es mit der Zeile schon versucht, aber Kontextmenü hatte ich noch immer. Das heisst es geht nur über FramelessWindowHint? Wenn ich von QProgressDialog ableite müsste ich setWindowFlags implementieren? Danke!
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: QProgressDialog

Beitrag von Exasperation »

Was genau ist deiner Meinung nach ein Kontextmenü? :)
Ein Kontextmenü ist eigentlich das, was du in normalen Windowsprogrammen über einen Rechtsklick erreichst (eben passend zum aktuellen Kontext).

Oder meinst du ein kleines Menü ihm Fensterrahmen?
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: QProgressDialog

Beitrag von sooofunky »

Stimmt, Kontextmenü ist es nicht. Ich meine das Menü in dem Fenstereinstellungen vorgenommen werden können (maximieren, verschieben,...). Ich hatte gehofft, dass das deaktivieren des Menüs mit setzen einer Flag gelöst werden kann. Wenn ich folgendes mache:

Code: Alles auswählen

dialog->setWindowFlags(Qt::FramelessWindowHint);
sehe ich überhaupt keinen Dialog (trotz show()).
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: QProgressDialog

Beitrag von Exasperation »

Okay versuchs mal mit:

Code: Alles auswählen

dialog->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
Wenn das nicht funktioniert, dann zeig mir mal den Code mit dem du deinen Dialog anlegst und anzeigst.

Ansonsten kann man das natürlich auch ratz-fatz über ein eigenes QWidget mit QProgressBar lösen, da müsstest du halt die Cancel-Funktion gescheit implementieren.
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: QProgressDialog

Beitrag von sooofunky »

Super, das hat funktioniert!

Code: Alles auswählen

dialog->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: QProgressDialog

Beitrag von Exasperation »

Hab erst vermutet, dass es daran lag:
Note: This function calls setParent() when changing the flags for a window, causing the widget to be hidden. You must call show() to make the widget visible again.
Aber wahrscheinlich sind einfach nur durch das Setzen von Qt::FramelessWindowHint die von QDialog mitgebrachten Hints ersetzt worden.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QProgressDialog

Beitrag von franzf »

Aber wahrscheinlich sind einfach nur durch das Setzen von Qt::FramelessWindowHint die von QDialog mitgebrachten Hints ersetzt worden.
Die bestehen aber sicher nicht nur aus Qt::Dialog. Wenn man bestimmte Flags zu bestehenden Flags hinzufügen will, macht man das so:

Code: Alles auswählen

dialog->setWindowFlags(dialog->windowFlags() | Qt::FramelessWindowHint);
Nicht, dass am Ende andere wichtige Flags verloren gehen ;)
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: QProgressDialog

Beitrag von Exasperation »

Danke für den Hinweis franzf. :)

Habe vorhin mit einem Kollgen gesprochen und der war der Meinung, dass durch das Setzen eines einzigen Hints, dieser mit den bestehenden von QDialog ver-odert werden müsste. So wie in Qt::Dialog die "Window"-Flags mit einem zusätzlichen Bit verodert werden, würde es mit setWindowFlags( Qt::FramelessWindowHint ) nur zur Folge haben, dass dieser Hint hinzugefügt, die alten aber nicht gelöscht werden. Kann das sein?

Ich war eigentlich auch der Meinung, dass man die Dialog Flags (am besten die des bearbeiteten Widgets, wie du es gezeigt hast) mit angibt...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QProgressDialog

Beitrag von franzf »

Exasperation hat geschrieben:So wie in Qt::Dialog die "Window"-Flags mit einem zusätzlichen Bit verodert werden, würde es mit setWindowFlags( Qt::FramelessWindowHint ) nur zur Folge haben, dass dieser Hint hinzugefügt, die alten aber nicht gelöscht werden. Kann das sein?
Nö, sollte eigentlich nicht sein. Wäre ja doof, so kann man nie mehr gesetzte Flags entfernen ^^
Schau dir mal zum Vergleich QPainter::setRenderHint[s]() an (vor allem den zweiten Parameter).
Antworten