C++ 通过QPushButton信号更改QLabel setPixmap()

C++ 通过QPushButton信号更改QLabel setPixmap(),c++,qt,qpixmap,qlabel,C++,Qt,Qpixmap,Qlabel,我正在编写一个简单的程序,当按下按钮时显示图像。我对Qt非常陌生,我没有任何机会确定我的问题发生在哪里 class ImageSwitcher : public QWidget { Q_OBJECT public: ImageSwitcher(); QPushButton *leftButton; QPushButton *rightButton; ~ImageSwitcher(); private slots: void switchImages(QPixmap

我正在编写一个简单的程序,当按下按钮时显示图像。我对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()不是两个插槽。奇怪的是,它没有给我同样的警告。当我运行时,没有一个小部件填充,因此,我不确定连接是否工作正常


谢谢你的帮助

您对信号和插槽的使用是错误的。在连接呼叫中,您必须给出信号的签名,而不是插槽值。值通过emit传输。基本上,您应该为每个按钮单击实现插槽,然后使用QPixmap参数发出新信号

signals:
void changeImage(QPixmap);
...

private slots:
...
void onLeftButton();
在构造函数中:

...
connect(this, SIGNAL(changeImage(QPixmap)), this, SLOT(switchImages(QPixmap)));
...
ImageSwitcher::ImageSwitcher (void) {

...

QWidget window;
window.setLayout(layout);
}
在onLeftButton()中:

-----编辑-----

再次查看您的代码,我发现了问题所在。在构造函数中:

...
connect(this, SIGNAL(changeImage(QPixmap)), this, SLOT(switchImages(QPixmap)));
...
ImageSwitcher::ImageSwitcher (void) {

...

QWidget window;
window.setLayout(layout);
}
QWidget窗口在堆栈上创建QWidget。这意味着它将在显示之前被销毁。由于ImageSwitcher继承了QWidget(ImageSwitcher是一个QWidget),您可能想写:

ImageSwitcher::ImageSwitcher (void) {

...

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

您不能手动将参数放入插槽中。信号的参数被传递到插槽。信号和插槽的参数必须相同。谢谢。修复了有关插槽的错误。。。但是,程序仍然不显示任何按钮或“我的标签”。我已经使其中一些元素在单独的、更简单的程序中工作。我想我在推导我的类时出错了。