c++ - una - ¿Cómo se llama a la función después de la ventana?
miniwin ejemplos (7)
Encontré una buena respuesta en esta pregunta que funciona bien, incluso si usa una función Sleep ().
Así que intenté esto:
//- 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
Usando Qt creo un QMainWindow y quiero llamar a una función DESPUÉS de que se muestre la ventana. Cuando llamo a la función en el constructor, se llama a la función (un diálogo en realidad) antes de que se muestre la ventana.
La mejor solución para mí es contar una vez evento de pintura:
.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++;
}
}
Lo resolví sin un temporizador usando Paint event. Funciona para mí al menos en 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;
}
Reimplement método void show()
como este:
void MainWindow::show()
{
QMainWindow::show();
// Call your special function here.
}
Si desea hacer algo mientras el widget se hace visible, puede anular QWidget::showEvent siguiente manera:
class YourWidget : public QWidget { ...
void YourWidget::showEvent( QShowEvent* event ) {
QWidget::showEvent( event );
//your code here
}
Sigue el ejemplo de Reza Ebrahimi, pero ten esto en cuenta:
No omita el 5to parámetro de la función connect()
que especifica el tipo de conexión; asegúrese de que sea QueuedConnection
.
ES DECIR,
connect(this, SIGNAL(window_loaded), this, SLOT(your_function()), Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));
Creo que lograrías lo que necesitas si lo haces de esta manera.
- Existen varios tipos en las conexiones de ranura de señal:
AutoConnection
, ConexiónAutoConnection
,AutoConnection
QueuedConnection
,BlockingQueuedConnection
QueuedConnection
(+UniqueConnection
opcional). Lea el manual para más detalles. :)
prueba esto:
en mainwindow.h:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void showEvent(QShowEvent *ev);
private:
void showEventHelper();
Ui::MainWindow *ui;
}
en mainwindow.cpp:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
void MainWindow::showEvent(QShowEvent *ev)
{
QMainWindow::showEvent(ev);
showEventHelper();
}
void MainWindow::showEventHelper()
{
// your code placed here
}