QWinWidget im MFC-Dialogfeld wird nicht neu gezeichnet oder reagiert nicht auf Tabulator-/Pfeiltasten

 C Programming >> C-Programmierung >  >> Tags >> MFC
QWinWidget im MFC-Dialogfeld wird nicht neu gezeichnet oder reagiert nicht auf Tabulator-/Pfeiltasten


Ich verwende ein QWinWidget innerhalb eines MFC-Dialogs und das QWinWidget zeichnet sich nicht richtig und verarbeitet Tastatureingaben nicht richtig.


Neulackierung [ungelöst]


Innerhalb des QWinWidget habe ich ein QTableWidget. Wenn ich das QTableWidget scrolle, zeichnet es sich nicht neu, bis ich aufhöre zu scrollen, an welchem ​​Punkt es alles neu zeichnet. In ähnlicher Weise kann ich in Zellen im QTableWidget eingeben und das Steuerelement wird nicht aktualisiert, bis ich es erzwinge, es erneut zu aktualisieren, indem ich nach oben oder unten scrolle (es wird erneut aktualisiert, wenn das Scrollen aufhört).


Da dieses QWinWidget in einem MFC-CDialog untergebracht ist, habe ich versucht, die OnPaint-Methode des CDialog zu überschreiben und nur die QWinWidget::repaint-Methode aufzurufen, aber dies hat das gegenteilige Problem, dass jetzt nur das QWinWidget aktualisiert und das CDialog nie neu gezeichnet wird, was zu Artefakten führt . Wenn ich QWinWidget::repaint und CDialog::OnPaint aufrufe, ist das Ergebnis dasselbe, als ob die OnPaint-Methode nicht überschrieben würde. Hat jemand dieses Problem schon einmal gesehen oder weiß, wie man es löst?


Tastatureingabe [Gelöst]


Keines der Steuerelemente im QWinWidget reagiert korrekt auf die Tabulatortaste oder die Pfeiltasten. Die Tabulator-/Pfeiltasten überspringen einfach das gesamte QWinWidget (und alle untergeordneten Steuerelemente). Selbst wenn ich in das QWinWidget klicke und ein Steuerelement auswähle, wird beim nächsten Drücken der Tabulatortaste der Fokus vollständig aus dem gesamten QWinWidget entfernt.


Mir ist aufgefallen, dass das QWinWidget zwei Funktionen hat, QWinWidget::focusNextPrevChild und QWinWidget::focusInEvent, und beide haben einen Kommentar-Header mit der Aufschrift „\reimp“. Soll ich diese Funktionen überschreiben, um die korrekte Tab-Funktionalität zu erhalten? Wenn ja, wie können diese Funktionen für eine korrekte Registerkartenfunktionalität implementiert werden.


Antworten:


Ich habe das Problem mit der Tastatureingabe behoben. Die QWinWidget-Klasse benötigte einige Änderungen:


in der Methode QWinWidget::init muss WS_TABSTOP zum Fensterstil hinzugefügt werden:


SetWindowLong(winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP);

Außerdem muss die QWinWidget::winEvent-Methode auf den WM_GETDLGCODE reagieren, um Windows mitzuteilen, dass es daran interessiert ist, Tasten-/Tab-Eingaben zu erhalten. Ich musste diesen if-Block hinzufügen:


if(msg->message == WM_GETDLGCODE)
{
*result = DLGC_WANTARROWS | DLGC_WANTTAB;
return(true);
}

Ich arbeite immer noch daran, das Widget richtig zu malen.


Einige Code-Antworten


  1. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">SetWindowLong(winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP);
  1. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">SetWindowLong(winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP);
SetWindowLong(winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP);
  1. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">if(msg->message == WM_GETDLGCODE)
  2. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">{
  3. margin:0;
    padding:0;
    background:none;
    vertical-align:top;"> *result = DLGC_WANTARROWS | DLGC_WANTTAB;
  4. margin:0;
    padding:0;
    background:none;
    vertical-align:top;"> return(true);
  5. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">}
  1. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">if(msg->message == WM_GETDLGCODE)
  2. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">{
  3. margin:0;
    padding:0;
    background:none;
    vertical-align:top;"> *result = DLGC_WANTARROWS | DLGC_WANTTAB;
  4. margin:0;
    padding:0;
    background:none;
    vertical-align:top;"> return(true);
  5. margin:0;
    padding:0;
    background:none;
    vertical-align:top;">}
if(msg->message == WM_GETDLGCODE)  {
*result = DLGC_WANTARROWS | DLGC_WANTTAB;
return(true);
}