簡體   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