2013-04-23 3 views
0

빠른 속도가 필요한 대형 응용 프로그램을 만들고 있습니다. 나는 하나의 윈도우가로드 된 다음 6 개의 이미지를 약 126x105 크기로 확대 한 다음 6 개의 PushButton에 아이콘으로 설정합니다. 이 프로세스는 완료하는 데 약 2 초가 걸리고 6 개의 그림을 크기 조정할 때까지 GUI가 표시되지 않습니다. GUI를 표시하고 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

+0

왜 이미지를 pre-scale하고'.qrc' 파일에 저장하지 않을까요? – trojanfoe

+1

스레드 (UI를 차단하고 싶지 않은 경우 가장 좋은 아이디어)를 사용하거나 이벤트 루프가 시작되면 실행되는 생성자에서 보내는 대기중인 신호/슬롯 연결을 사용할 수 있습니다. – Pete

답변

0

귀하의 GUI가 표시되지 않습니다. 예를 들어, 크기 조정 픽스맵을 연기하려고하면 QTimer::singleShot()을 사용하고 타이머 콜백에서이 작업을 수행하십시오.

+0

그게 내 생각이었습니다. 그러나 어떤 시간 간격을 넣을 지 어떻게 알 수 있습니까? 어떤 컴퓨터는 느리고 다른 컴퓨터는 더 빨라서 시간 간격이 가변적 일 수 있습니다. – Alen

+0

@Alen, 간격 0을 사용할 수 있습니다.이 경우 윈도우 시스템의 이벤트 대기열에있는 모든 이벤트가 처리되는 즉시'QTimer'가 시작됩니다. [QTimer :: interval] (http://qt-project.org/doc/qt-4.8/qtimer.html#interval-prop)을 참조하십시오. 물론 타이머 콜백은 UI를 다시 차단하지만 UI는 더 빨리 표시됩니다. @Pete가 제안한 것처럼, 썸네일 생성을 위해 별도의 스레드를 생성 할 수도 있습니다. – Paul

관련 문제