2012-11-26 6 views
0

버튼을 누르면 이미지를 표시하는 간단한 프로그램을 작성하고 있습니다. Qt를 처음 접했을 때 문제가 발생한 곳을 확인하지 못했습니다.QPushButton 신호를 통해 QLabel setPixmap() 변경

class ImageSwitcher : public QWidget 
{ 
    Q_OBJECT 
    public: 
ImageSwitcher(); 
    QPushButton *leftButton; 
    QPushButton *rightButton; 
~ImageSwitcher(); 
    private slots: 
void switchImages(QPixmap display); 
    private: 
    QLabel *canvas; 
    QPixmap *one; 
    QPixmap *two; 
}; 

클래스 선언 :

ImageSwitcher::ImageSwitcher (void) { 
canvas  = new QLabel; 
one   = new QPixmap; 
two   = new QPixmap; 
leftButton = new QPushButton("&One"); 
rightButton = new QPushButton("&Two"); 


    one->load("one.png"); 
    two->load("two.png"); 

//Close the program if the images cannot be loaded. 
//Load the images to the QPixmaps. 
//Connect the left and right buttons. 
QObject::connect(leftButton, SIGNAL(clicked()), canvas, SLOT(switchImages(*one))); 
QObject::connect(rightButton, SIGNAL(clicked()), canvas, SLOT(switchImages(*two))); 

QHBoxLayout *layout = new QHBoxLayout; 
layout->addWidget(canvas); 
layout->addWidget(leftButton); 
layout->addWidget(rightButton); 

QWidget window; 
window.setLayout(layout); 
} 

void ImageSwitcher::switchImages(QPixmap display) { 
canvas->setPixmap(display); 
} 

ImageSwitcher::~ImageSwitcher (void) { 
delete canvas; 
delete one; 
delete two; 
delete leftButton; 
delete rightButton; 
} 

그리고 마지막으로 주요 기능은 :

int main (int args, char **argv) 
{ 
QApplication app(args, argv); 
ImageSwitcher test; 
test.show(); 
    return app.exec(); 
} 

나는 데 첫 번째 문제는 내 레이아웃 설정이 잘못이라는 것이다. 두 번째로, 명령 행은 switchImages()가 2에 대한 SLOT이 아니라고 경고합니다. 이상하게도, 그것은 나에게 같은 경고를주지 않습니다. 내가 실행할 때 어떤 위젯도 채워지지 않으므로 연결이 전혀 작동하는지 잘 모르겠습니다.

감사합니다. 감사합니다.

+0

수동으로 SLOT에 인수를 넣을 수 없습니다. 신호로부터의 인수는 슬롯으로 전달된다. 즉. 신호와 슬롯은 같은 인수를 가져야합니다. –

답변

1

신호 및 슬롯 사용이 잘못되었습니다. 연결 호출에서 신호의 시그너처와 슬롯 값을 제공해야합니다. 값은 방출을 통해 전송됩니다. 기본적으로 각 버튼 클릭에 대한 슬롯을 구현하고 QPixmap 인수로 새 신호를 방출해야합니다. 생성자에서

signals: 
void changeImage(QPixmap); 
... 

private slots: 
... 
void onLeftButton(); 

: onLeftButton()에서

... 
connect(this, SIGNAL(changeImage(QPixmap)), this, SLOT(switchImages(QPixmap))); 
... 

:

emit changeImage(*one) 

----- 편집 -----

내가 다시 코드를 보면 문제를 참조하십시오. 생성자에서 :

ImageSwitcher::ImageSwitcher (void) { 

... 

QWidget window; 
window.setLayout(layout); 
} 

QWidget window;은 스택에 QWidget을 생성합니다. 즉, 표시되기 전에 파괴 될 것입니다. ImageSwitcher는 QWidget (ImageSwitcher는 QWidget)에서 상속 받았기 때문에 다음과 같이 쓸 수 있습니다.

ImageSwitcher::ImageSwitcher (void) { 

... 

setLayout(layout); // same as this->setLayout(layout); 
} 
+0

감사합니다. 그 슬롯에 관한 오류가 해결 ... 그러나, 프로그램은 여전히 ​​버튼이나 내 레이블을 표시하지 않습니다. 이러한 요소 중 일부를 별도의보다 간단한 프로그램에서 작동하도록 만들었습니다. 내 수업을 파생시키는 데 오류가 있다고 생각합니다. – mr0il

+0

내 대답이 업데이트되었습니다. – JustMaximumPower