Изменение QLabel setPixmap () с помощью сигнала QPushButton

Я пишу простую программу, которая отображает изображение при нажатии кнопки. Я очень новичок в 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 () не является слотом для двоих. Как ни странно, это не дает мне то же самое предупреждение для одного. Ни один из виджетов не заполняется при запуске, поэтому я не совсем уверен, работают ли соединения вообще.

Любая помощь приветствуется, спасибо.

0

Решение

Вы используете сигнал и слоты неправильно. В соединительном вызове вы должны указать сигнатуру сигнала, а слот не значения. Значения передаются через emit. В основном вы должны реализовать слоты для каждого нажатия кнопки, а затем генерировать новый сигнал с аргументом 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]