繁体   English   中英

如何从Qt中的其他表单在QLabel上设置图像

[英]How to set an Image on QLabel from other form in Qt

在学习主要主题之前,请注意我是Qt的初学者。 我做了一个AddIm.cpp,我想在MainWindow的QLabel上设置一个图像。

这是我在AddIm.cpp中的来源

void AddIm::on_pushButton_clicked()
{
    MainWindow mainwindow;
    mainwindow.setImage();
}

这是MainWindow.cpp

void MainWindow::setImage()
{
    QPixmap pix("./test.jpg");
    ui->label->setPixmap(pix);
}

和MainWindow.h

class MainWindow : public QMainWindow
{
    public:
    void setImage();

    ~ some source ~

    private:
    Ui::MainWindow *ui;
};

它根本不起作用。 所以我在MainWindow中添加了一个按钮进行测试。 单击时,setImage起作用。 但是当我在AddIm中执行setImage时。 它不起作用。 请让我知道为什么

您的问题与您对Qt的了解无关,而与您对c ++的了解无关。

AddIm::on_pushButton_clicked() ,在堆栈上创建一个新的MainWindow对象,创建图像,然后退出该函数。

当函数退出时,所有本地堆栈对象都将被销毁。 这意味着您的图像确实已被加载,但是在您有机会看到它之前,窗口已被破坏。 即使它存活的时间超过了功能允许的时间,也永远不会显示该窗口,因此它将保持隐藏状态。

更新:

AddIm.cpp更改为以下内容:

void AddIm::on_pushButton_clicked()
{
    MainWindow *mainwindow = new MainWindow;
    mainwindow->setAttribute(Qt::WA_DeleteOnClose, true);
    mainwindow->setImage();
    mainwindow->show();
}

您没有显示窗口。

首先,您必须创建一个C ++类,而不是一个.cpp文件。 然后在您的AddIm.h文件中添加一个指向窗口的指针:

private:
MainWindow* mainwindow;

然后在您的AddIm.cpp文件中:

mainwindow = new MainWindow(this);
mainwindow->setAttribute(Qt::WA_DeleteOnClose, true); // prevent memory leak when closing window
mainwindow->setImage();
mainwindow->show();

并记住在AddIm.h中包含MainWIndow

#include "mainwindow.h"

将此与您的代码进行比较,以查看可能出了问题的地方。 我像您一样尝试了尽可能多的代码。 我几乎不使用设计器,我喜欢编写所有代码。 它按预期工作。

主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QLabel>
#include <QPixmap>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    void setImage();

private:
    QLabel *label;
};

#endif // MAINWINDOW_H

主窗口

#include "mainwindow.h"
#include "ui_mainwindow.h"

void MainWindow::setImage() {
    QPixmap pix(":/test.jpg");

    label = new QLabel;
    label->setPixmap(pix);

    label->show();
}

addim.h

#ifndef ADDIM_H
#define ADDIM_H

#include <QMainWindow>
#include <QPushButton>
#include <QHBoxLayout>

#include "mainwindow.h"

class AddIm : public QMainWindow {
    Q_OBJECT
public:
    AddIm(QWidget *parent = 0);
    ~AddIm();

private slots:
    void on_pushButton_clicked();

private:
    QPushButton *button;
};

#endif // ADDIM_H

addim.cpp

#include "addim.h"

AddIm::AddIm(QWidget *parent) : QMainWindow(parent) {

    button = new QPushButton("Show Image");

    setCentralWidget(button);

    connect(button, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
}

void AddIm::on_pushButton_clicked() {
    MainWindow mainwindow;
    mainwindow.setImage();
}

AddIm::~AddIm() {

}

main.cpp

#include "addim.h"
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    AddIm window;
    window.show();

    return a.exec();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM