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?
cevap
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
}
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
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ı). –
Önerilen uygulamanızın dördüne gittim, ancak pencerenin görüntülenmesinden ÖNCE iletişim kutusu hala gösteriliyor. – HWende
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
}
Parentezler eksik, bağlanmalı (bu, SIGNAL (window_loaded()), bu, SLOT (your_function())); – vsz
@vsz editted, teşekkürler –
Ş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. –
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.
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
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;
}
reimplement yöntemi void show()
:
void MainWindow::show()
{
QMainWindow::show();
// Call your special function here.
}
Ç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
benim için en iyi çözüm kez saymak boya olay:
.H
public:
void paintEvent(QPaintEvent *event);
.CPP
- 1. Kullanıcı denetimi görüntülendikten sonra bir yöntem nasıl çağırılır
- 2. Yii2 ekran görüntülendikten sonra
- 3. Öğe DOM öğesinde görüntülendikten sonra Çalıştır işlevi
- 4. Başka bir dosyadan nasıl işlev çağırılır?
- 5. setTimeout için verilen işlev ne ile çağırılır?
- 6. jQuery 3.0 $ (pencere) .load (işlev() {});
- 7. Aynı nesne içinde başka bir işlev nasıl çağırılır?
- 8. Retrofit android kullanarak doğrudan bir işlev php nasıl çağırılır
- 9. Aurelia: Özel elemanın dışında bir işlev nasıl çağırılır?
- 10. Phonegap Cordova - Tam ekran görüntülendikten sonra altta siyah durum çubuğu
- 11. X öğeleri görüntülendikten sonra yeni tablo satırı ekleme
- 12. Kullanıcı yetkilendirmesinden sonra dizin/dizin yolu modeli kancası nasıl çağırılır?
- 13. odağı bir metin kutusundan kaybettikten sonra nasıl çağırılır asp.net mvc
- 14. C++ 'da geçersiz kılındıktan sonra orijinal işlevi nasıl çağırılır?
- 15. Form Nasıl Çağırılır?
- 16. Pencere kapatıldıktan sonra geri yüklenmez
- 17. İşlev, işlev tamamlandıktan sonra görüntüyü sıfırlamak için
- 18. Java'dan C# işlevi nasıl çağırılır
- 19. Android Crash, java.lang.IllegalArgumentException: Pencere eklendikten sonra pencere tipi değiştirilemiyor
- 20. Komut isteminden .m dahili işlevi nasıl çağırılır?
- 21. Fotoğraf nasıl görüntülendikten sonra metin yerine yeni bir satırda bir resim sola hizalanmış?
- 22. AngularJS denetleyicisinde mailto nasıl çağırılır
- 23. C++ API nasıl çağırılır C#
- 24. adaptör sınıfından getsupportfragmentmanager() nasıl çağırılır?
- 25. Windows Service'ten WebAPI nasıl çağırılır
- 26. Java kodundan nasıl servlet çağırılır
- 27. Java WebServisler - nasıl servis çağırılır?
- 28. .eex dosyasından işlevler nasıl çağırılır
- 29. jwplayer'da birer birer href işlevi nasıl çağırılır
- 30. MathJax nasıl geri çağırılır veya yeniden başlatılır?
"QMainWindow :: show()" ve ardından "QMetaObject :: invokeMethod()" işlevini çağırın ve yapmak istediğiniz her şeyi yapın. – Trilarion