2013-01-16 15 views
23

Qt'yi Kullanma Bir QMainWindow oluşturun ve pencerelerin görüntülendikten sonra işlevini çağırmak istiyorum. Ben (aslında bir iletişim) yapıcı işlevi işlevini çağırdığınızda en adlandırılan penceresi gösterilir önce olsun.Pencere görüntülendikten sonra işlev nasıl çağırılır?

+0

"QMainWindow :: show()" ve ardından "QMetaObject :: invokeMethod()" işlevini çağırın ve yapmak istediğiniz her şeyi yapın. – Trilarion

cevap

21

Widget görünür hale getirilir iken bir şey yapmak istiyorsanız, böyle QWidget::showEvent geçersiz kılabilirsiniz:

class YourWidget : public QWidget { ... 

void YourWidget::showEvent(QShowEvent* event) { 
    QWidget::showEvent(event); 
    //your code here 
} 
+2

Ben zaten kendi gösterisi fonksiyonunu yerine getirmek düşündüm, ama bunu kendi kod ÖNCE ebeveynin gösterisi işlevini çağırır Bunu bana asla oluştu.* facepalm * – HWende

+1

Aslında, bu durumda, QWidget :: showEvent() 'nin uygulaması boş olduğu ve hiçbir şey yapmadığı için, QWidget :: showEvent() öğesini çağırdığınızda fark yaratmaz. (Elbette, güvenmemesi gereken bir uygulama detayı). –

+6

Önerilen uygulamanızın dördüne gittim, ancak pencerenin görüntülenmesinden ÖNCE iletişim kutusu hala gösteriliyor. – HWende

11

deneyin bu:

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(); 
} 
: mainwindow.h içinde

mainwindow.cpp içinde

:

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 
} 
+0

Parentezler eksik, bağlanmalı (bu, SIGNAL (window_loaded()), bu, SLOT (your_function())); – vsz

+1

@vsz editted, teşekkürler –

+1

Şaşırtıcı ama aynı zamanda komik, neden bu ekstra sinyal ve yuvası kullanmak için. İşlevi (örneğin * doWork() *) doğrudan MainWindow :: showEvent() boşluğunun içinde çağırır. –

11

Takip Rıza Ebrahimi örneğinin, ancak bu akılda tutmak:

bağlantı türünü belirtir connect() fonksiyonun 5 parametresini ihmal etmeyin; QueuedConnection olduğundan emin olun.

yani

connect(this, SIGNAL(window_loaded), this, SLOT(your_function()), Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection)); 

Ben bunu bu şekilde yaparsak neye ihtiyacınız elde ediyorum inanıyoruz.

  • sinyal yuvası bağlantısı için birçok tipi vardır: AutoConnection, DirectConnection, QueuedConnection, BlockingQueuedConnection (+ isteğe bağlı UniqueConnection). Ayrıntılar için kılavuzu okuyun.
1

Bir Sleep() işlevini kullanmasanız bile iyi çalışan, this question numaralı telefondan güzel bir yanıt buldum.

//- 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 
0

Ben Paint olay kullanarak bir zamanlayıcı olmadan çözüldü:

Yani bu çalıştı. En azından Windows için benim için çalışıyor. Böyle

// 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; 
} 
0

reimplement yöntemi void show():

void MainWindow::show() 
{ 
    QMainWindow::show(); 
    // Call your special function here. 
} 
+0

Çevrenizdeki herkes için sadece arkadaşça bir hatırlatma: 'QWidget :: show()' sanal değil ve bu nedenle "yeniden yayımlanan" yöntemini bir upcast işaretçisinde çağırmaya çalışmak kaçınılmaz olarak başarısız olur. – user35443

0

benim için en iyi çözüm kez saymak boya olay:

.H

public: 
void paintEvent(QPaintEvent *event); 

.CPP

İlgili konular