QWinWidget Dentro la finestra di dialogo MFC non si ridisegna o non risponde ai tasti Tab/Freccia

 C Programming >> Programmazione C >  >> Tags >> MFC
QWinWidget Dentro la finestra di dialogo MFC non si ridisegna o non risponde ai tasti Tab/Freccia


Sto usando un QWinWidget all'interno di una finestra di dialogo MFC e QWinWidget non si disegna correttamente e non gestisce correttamente l'input da tastiera.


Riverniciatura [non risolto]


All'interno di QWinWidget, ho un QTableWidget. Quando scorro QTableWidget, non si ridisegna finché non smetto di scorrere, a quel punto ridisegna tutto. Allo stesso modo, posso digitare nelle celle in QTableWidget e il controllo non viene aggiornato finché non lo forzo a riaggiornarsi scorrendo verso l'alto o verso il basso (si aggiorna nuovamente quando lo scorrimento si interrompe).


Poiché questo QWinWidget è ospitato in un CDialog MFC, ho provato a sovrascrivere il metodo OnPaint di CDialog e chiamare solo il metodo QWinWidget::repaint, tuttavia questo ha il problema opposto in cui ora viene aggiornato solo QWinWidget e il CDialog non viene mai ridisegnato, risultando in artefatti . Se chiamo QWinWidget::repaint e CDialog::OnPaint, il risultato è lo stesso che non sovrascrive il metodo OnPaint. Qualcuno ha mai visto questo problema o sa come risolverlo?


Inserimento da tastiera [Risolto]


Nessuno dei controlli all'interno di QWinWidget risponde correttamente al tasto Tab o ai tasti freccia. I tasti tab/freccia saltano semplicemente sull'intero QWinWidget (e su tutti i controlli figlio). Anche se faccio clic all'interno del QWinWidget e seleziono un controllo, la prossima volta che premo il tasto Tab, lo stato attivo salta completamente fuori dall'intero QWinWidget.


Ho notato che QWinWidget ha due funzioni, QWinWidget::focusNextPrevChild e QWinWidget::focusInEvent ed entrambi hanno un'intestazione di commento che dice "\reimp". Dovrei sovrascrivere queste funzioni per ottenere la corretta funzionalità della scheda? In tal caso, come possono essere implementate queste funzioni per una corretta funzionalità delle schede.


Risposte:


Ho risolto il problema dell'input da tastiera. La classe QWinWidget necessitava di alcune modifiche:


nel metodo QWinWidget::init, è necessario aggiungere WS_TABSTOP allo stile della finestra:


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

Inoltre, il metodo QWinWidget::winEvent deve rispondere a WM_GETDLGCODE per far sapere a Windows che è interessato a ricevere input chiave/scheda. Ho dovuto aggiungere questo se blocco:


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

Sto ancora lavorando per fare in modo che il widget dipinga correttamente.


Alcune risposte al codice


  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);
}