Utilizzo di Qt Creare una QMainWindow e si desidera richiamare una funzione DOPO che viene visualizzata la finestra. Quando chiamo la funzione nel costruttore la funzione (in effetti una finestra di dialogo) viene chiamata prima che venga visualizzata la finestra.Come chiamare la funzione dopo che viene visualizzata la finestra?
risposta
Se si vuole fare qualcosa, mentre il widget è reso visibile, è possibile ignorare QWidget::showEvent in questo modo:
class YourWidget : public QWidget { ...
void YourWidget::showEvent(QShowEvent* event) {
QWidget::showEvent(event);
//your code here
}
Ho già pensato di implementare la mia funzione show, ma non mi è mai venuto in mente che potrei chiamare la funzione show dei genitori PRIMA del mio codice.* facepalm * – HWende
In realtà, in questo caso, non fa differenza dove si chiama QWidget :: showEvent(), perché l'implementazione di QWidget :: showEvent() è vuota e non fa nulla. (Questo è ovviamente un dettaglio di implementazione su cui non si dovrebbe fare affidamento). –
Sono andato a quattro l'implementazione suggerita ma la finestra di dialogo è ancora mostrata PRIMA che venga visualizzata la finestra. – HWende
provare questo:
in mainwindow.h:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void showEvent(QShowEvent *ev);
signals:
void sigShowEvent();
private slots:
void slotShowEvent();
}
in mainwindow.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this, SIGNAL(sigShowEvent()), this, SLOT(slotShowEvent()));
}
void MainWindow::showEvent(QShowEvent *ev)
{
QMainWindow::showEvent(ev);
emit sigShowEvent();
}
void MainWindow::slotShowEvent()
{
// your code placed here
}
esempio
Parentesi mancanti, dovrebbe essere 'connect (questo, SIGNAL (window_loaded()), this, SLOT (your_function()));' – vsz
@vsz editted, grazie –
Incredibile ma divertente allo stesso tempo, perché usare questo segnale e uno slot extra. Richiama la funzione (ad esempio * doWork() *) direttamente all'interno del void MainWindow :: showEvent(). –
Segui Reza di Ebrahimi, ma tenere a mente:
Non omettere il quinto parametro della connect()
funzione che specifica il tipo di connessione; assicurati che sia QueuedConnection
.
cioè
connect(this, SIGNAL(window_loaded), this, SLOT(your_function()), Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));
credo che si sarebbe ottenere quello che vi serve se lo si fa in questo modo.
- Ci sono diversi tipi di connessioni segnale slot:
AutoConnection
,DirectConnection
,QueuedConnection
,BlockingQueuedConnection
(+ opzionaleUniqueConnection
). Leggi il manuale per i dettagli. :)
Ho trovato una bella risposta in this question che funziona bene, anche se si utilizza una funzione Sleep().
Quindi provato questo:
//- cpp-file ----------------------------------------
#include "myapp.h"
#include <time.h>
#include <iosteream>
MyApp::MyApp(QWidget *parent)
: QMainWindow(parent, Qt::FramelessWindowHint)
{
ui.setupUi(this);
}
MyApp::~MyApp()
{
}
void MyApp::showEvent(QShowEvent *event) {
QMainWindow::showEvent(event);
QTimer::singleShot(50, this, SLOT(window_shown()));
return;
}
void MyApp::window_shown() {
std::cout << "Running" << std::endl;
Sleep(10000);
std::cout << "Delayed" << std::endl;
return;
}
//- h-file ----------------------------------------
#ifndef MYAPP_H
#define MYAPP_H
#include <QtWidgets/QMainWindow>
#include <qtimer.h>
#include <time.h>
#include "ui_myapp.h"
class MyApp : public QMainWindow
{
Q_OBJECT
public:
MyApp(QWidget *parent = 0);
~MyApp();
protected:
void showEvent(QShowEvent *event);
private slots:
void window_shown();
private:
Ui::MyAppClass ui;
};
#endif // MYAPP_H
ho risolto senza un timer utilizzando evento Paint. Funziona per me almeno su Windows.
// MainWindow.h
class MainWindow : public QMainWindow
{
...
bool event(QEvent *event) override;
void functionAfterShown();
...
bool functionAfterShownCalled = false;
...
}
// MainWindow.cpp
bool MainWindow::event(QEvent *event)
{
const bool ret_val = QMainWindow::event(event);
if(!functionAfterShownCalled && event->type() == QEvent::Paint)
{
functionAfterShown();
functionAfterShownCalled = true;
}
return ret_val;
}
metodo reimplementare void show()
come questo:
void MainWindow::show()
{
QMainWindow::show();
// Call your special function here.
}
Solo un promemoria amichevole per chiunque intorno: 'QWidget :: show()' non è virtuale, e quindi il tentativo di chiamare tale metodo "reimplementato" su un puntatore upcast fallirà inevitabilmente. – user35443
La soluzione migliore per me è il conteggio una volta vernice evento:
.H
public:
void paintEvent(QPaintEvent *event);
cpp
#include "qpainter.h"
#include <QMessageBox> // example
int contPaintEvent= 0;
void Form2::paintEvent(QPaintEvent* event)
{
if (contPaintEvent ==0)
{
QPainter painter(this);
QMessageBox::information(this, "title", "1 event paint"); // example
// actions
contPaintEvent++;
}
}
- 1. La finestra di dialogo Android viene visualizzata di nuovo dopo che l'attività viene ricreata
- 2. Chiamare una funzione quando la finestra viene ridimensionata
- 3. La finestra di dialogo degli avvisi non viene visualizzata
- 4. La finestra di esportazione di Inkscape non viene visualizzata ??
- 5. form.ShowDialog() non viene visualizzata la finestra con il debug abilitato
- 6. JavaScript richiamata dopo la funzione
- 7. La finestra di stampa Matplotlib viene visualizzata su desktop diversi
- 8. Come chiamare la funzione finestra genitore nel browser Chrome?
- 9. setImmediate() viene chiamato dopo la funzione setTimeout()
- 10. Come chiamare la funzione dopo il rendering dom in Angular2
- 11. DialogFragment che non si ridimensiona quando viene visualizzata la tastiera
- 12. Come chiamare una funzione dopo che un div è pronto?
- 13. aprire una nuova finestra e chiamare la funzione javascript
- 14. La documentazione non viene visualizzata nell'output doxygen
- 15. La mappa di leaflet.js non viene visualizzata
- 16. La visualizzazione dell'intestazione non viene visualizzata dopo la ricerca iOS8 + XCode6
- 17. iOS8: la barra blu "utilizza la posizione" viene visualizzata poco dopo l'uscita dall'app
- 18. WPF: impossibile riutilizzare la finestra dopo che è stata chiusa
- 19. Come chiudere la finestra dopo che l'avviso viene chiuso all'interno php
- 20. Come minimizzare la finestra del proprietario quando viene visualizzata una modale?
- 21. La finestra di dialogo di stampa non viene visualizzata in anteprima
- 22. La finestra non viene visualizzata nell'interprete python in GTK3 senza Gtk.main()
- 23. Avvio dell'app GUI dal servizio di Windows - La finestra non viene visualizzata
- 24. Come chiamare una funzione * dopo * onPreferenceChange?
- 25. Come chiamare la funzione anonymus dalla stringa
- 26. Come chiamare la funzione nel plugin jquery?
- 27. Come chiamare la funzione anonima in C#?
- 28. In che modo la compilazione sceglie quale funzione modello chiamare?
- 29. Come chiamare la funzione C# da java
- 30. come chiamare la funzione js senza evento
Chiama 'QMainWindow :: show()' e quindi 'QMetaObject :: invokeMethod()' e fai ciò che vuoi anche fare. – Trilarion