ventana una studio programacion miniwin lenguaje hacer grafica funciones ejemplos crear como c++ qt

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ón AutoConnection , 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 }