0

ボタンが押されたときに画像を表示する簡単なプログラムを書いています。私は Qt に非常に慣れていないため、問題が発生している場所を特定することができません。

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 ではないことを警告します。奇妙なことに、同じ警告は表示されません。実行時にウィジェットが読み込まれないため、接続がまったく機能しているかどうかはよくわかりません。

どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

1

シグナルとスロットの使い方が間違っています。接続呼び出しでは、信号の署名と値ではなくスロットを指定する必要があります。値は、e​​mit を介して送信されます。基本的に、ボタンのクリックごとにスロットを実装し、QPixmap 引数で新しいシグナルを発行する必要があります。

signals:
void changeImage(QPixmap);
...

private slots:
...
void onLeftButton();

コンストラクターで:

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

onLeftButton() で:

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);
}
于 2012-11-26T10:22:53.373 に答える