2013-04-23 60 views
0

我在做大型應用程序,它需要快速。我有一個窗口被加載,然後我將6個圖像縮放到126x105的大小,然後將它們設置爲6個按鈕上的圖標。此過程需要大約2秒才能完成,並且在縮放這6張圖片之前不會顯示GUI。有沒有什麼方法可以顯示圖形用戶界面,並且在加載圖形用戶界面後,縮放圖像並將其設置爲圖標 這是代碼:Qt C++加載GUI然後加載其他設置

f = new QFrame(this); 
    f->setStyleSheet("background-color: rgba(240, 240, 240, 85%);" 
        "border: 2px solid green;" 
        "border-radius: 12px;"); 
    f->setGeometry(this->width/2-250, this->height/2-200, 500, 300); 
    f->show(); 

    frameZatvori = new QPushButton(this); 
    frameZatvori->setFlat(true); 
    frameZatvori->setFont(QFont("Droid Sans", 9, QFont::Bold)); 
    frameZatvori->setGeometry(f->x()+475, f->y()+10, 15, 15); 
    frameZatvori->setText("X"); 
    frameZatvori->setFocusPolicy(Qt::NoFocus); 
    frameZatvori->show(); 

    promjenaP1 = new QPushButton(this); 
    promjenaP1->setFlat(true); 
    promjenaP1->setStyleSheet("border-color: solid blue;" 
           "border: 3px;" 
           "border-radius: 9px;"); 

    promjenaP1->setFocusPolicy(Qt::NoFocus); 
    promjenaP1->setGeometry(f->x()+30, f->y()+30, 126, 105); 
    promjenaP1->show(); 

    promjenaP2 = new QPushButton(this); 
    promjenaP2->setFlat(true); 
    promjenaP2->setFocusPolicy(Qt::NoFocus); 
    promjenaP2->setGeometry(promjenaP1->x()+156, f->y()+30, 126, 105); 
    promjenaP2->show(); 

    promjenaP3 = new QPushButton(this); 
    promjenaP3->setFlat(true); 
    promjenaP3->setFocusPolicy(Qt::NoFocus); 
    promjenaP3->setGeometry(promjenaP2->x()+156, f->y()+30, 126, 105); 
    promjenaP3->show(); 

    promjenaP4 = new QPushButton(this); 
    promjenaP4->setFlat(true); 
    promjenaP4->setFocusPolicy(Qt::NoFocus); 
    promjenaP4->setGeometry(f->x()+30, promjenaP1->y()+135, 126, 105); 
    promjenaP4->show(); 

    promjenaP5 = new QPushButton(this); 
    promjenaP5->setFlat(true); 
    promjenaP5->setFocusPolicy(Qt::NoFocus); 
    promjenaP5->setGeometry(promjenaP1->x()+156, promjenaP1->y()+135, 126, 105); 
    promjenaP5->show(); 

    promjenaP6 = new QPushButton(this); 
    promjenaP6->setFlat(true); 
    promjenaP6->setFocusPolicy(Qt::NoFocus); 
    promjenaP6->setGeometry(promjenaP2->x()+156, promjenaP1->y()+135, 126, 105); 
    promjenaP6->show(); 

    QObject::connect(frameZatvori, SIGNAL(clicked()), this, SLOT(zatvoriPozadineFunkcija())); 

    QPixmap slika("/home/alen/QtSDK/writer/Pozadine/slika.jpg"); 
    QPixmap prebaci = slika.scaled(126, 105, Qt::IgnoreAspectRatio, Qt::FastTransformation); 
    promjenaP1->setIcon(prebaci); 
    promjenaP1->setIconSize(QSize(126, 105)); 
    QPixmap slika1("/home/alen/QtSDK/writer/Pozadine/slika1.jpg"); 
    QPixmap prebaci1 = slika1.scaled(126, 105, Qt::IgnoreAspectRatio, Qt::FastTransformation); 
    promjenaP2->setIcon(prebaci1); 
    promjenaP2->setIconSize(QSize(126, 105)); 
    QPixmap slika2("/home/alen/QtSDK/writer/Pozadine/slika2.jpg"); 
    QPixmap prebaci2 = slika2.scaled(126, 105, Qt::IgnoreAspectRatio, Qt::FastTransformation); 
    promjenaP3->setIcon(prebaci2); 
    promjenaP3->setIconSize(QSize(126, 105)); 
    QPixmap slika3("/home/alen/QtSDK/writer/Pozadine/slika3.jpg"); 
    QPixmap prebaci3 = slika3.scaled(126, 105, Qt::IgnoreAspectRatio, Qt::FastTransformation); 
    promjenaP4->setIcon(prebaci3); 
    promjenaP4->setIconSize(QSize(126, 105)); 
    QPixmap slika4("/home/alen/QtSDK/writer/Pozadine/slika4.jpg"); 
    QPixmap prebaci4 = slika4.scaled(126, 105, Qt::IgnoreAspectRatio, Qt::FastTransformation); 
    promjenaP5->setIcon(prebaci4); 
    promjenaP5->setIconSize(QSize(126, 105)); 
    QPixmap slika5("/home/alen/QtSDK/writer/Pozadine/slika5.jpg"); 
    QPixmap prebaci5 = slika5.scaled(126, 105, Qt::IgnoreAspectRatio, Qt::FastTransformation); 
    promjenaP6->setIcon(prebaci5); 
    promjenaP6->setIconSize(QSize(126, 105)); 
+0

負載的方式,但最好的辦法是讓他們預先縮放。 – Pete 2013-04-23 12:09:59

+0

爲什麼不預先縮放圖像並將它們存儲在'.qrc'文件中? – trojanfoe 2013-04-23 12:10:33

+1

你可以使用一個線程(如果你不想阻塞用戶界面,最好的辦法),或者使用從構造函數發送的排隊信號/插槽連接,一旦事件循環開始,它就會觸發。 – Pete 2013-04-23 12:10:54

回答

0

沒有顯示你的GUI應用程序,因爲事件不會在這個時候(我假設你正在做的這一切都在主線程)處理。嘗試推遲縮放pixmaps,例如,使用QTimer::singleShot()並在定時器回調中執行此操作。

+0

這也是我的想法,但我怎麼知道要放哪個時間間隔,有些電腦比較慢,其他的比我的要快,所以時間間隔會變化。 – Alen 2013-04-23 16:43:10

+0

@Alen,你可以使用間隔0,在這種情況下,只要窗口系統的事件隊列中的所有事件都已經被處理,'QTimer'就會觸發。參見[QTimer :: interval](http://qt-project.org/doc/qt-4.8/qtimer.html#interval-prop)。當然,定時器回調會再次阻止您的用戶界面,但至少您的用戶界面會更快顯示。另外,您可能想要爲縮略圖生成單獨的線程,就像@Pete建議的那樣。 – Paul 2013-04-23 19:53:09

相關問題