如何访问在 QtCreator Designer 中创建的 QLabel?

Posted

技术标签:

【中文标题】如何访问在 QtCreator Designer 中创建的 QLabel?【英文标题】:How to access a QLabel created in QtCreator Designer? 【发布时间】:2012-04-26 20:51:10 【问题描述】:

我使用 Qt Creator 和 opencv 在我的 MainWindow 中创建了几个 QLabel,但出现了这个错误:

错误:“ui”未在此范围内声明

在函数filter_image() 中。我想在做一些处理之前和之后使用标签来显示图像。

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include<QImage>
#include<QLabel>

static QImage IplImage2QImage(const IplImage *iplImage) 
    int height = iplImage->height;
    int width = iplImage->width;
    if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
    
        const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
        QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
        return img.rgbSwapped();
    
    else if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1)
    
        const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
        QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
        QVector<QRgb> colorTable;
        for (int i = 0; i < 256; i++)
        
            colorTable.push_back(qRgb(i, i, i));
        
        img.setColorTable(colorTable);
        return img;
    
    else
    
        std::cout << "Image cannot be converted.";
        return QImage();
    


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);


MainWindow::~MainWindow() 
    delete ui;


void MainWindow::changeEvent(QEvent *e)

    QMainWindow::changeEvent(e);
    switch (e->type()) 
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    


void filter_image(IplImage* img) 
    IplImage* roi = cvCreateImage(cvGetSize(img), 8, 3);
    cvCvtColor( img, roi, CV_RGB2GRAY );
    cvSmooth(img,roi,CV_BLUR, 5, 0, 0, 0);
    cvThreshold(roi,roi,100,255,CV_THRESH_BINARY);
    IplImage *img_de = cvCloneImage(roi);
    QImage qt_i = IplImage2QImage(img_de);
    QLabel label_2;
    // display on label
    ui->label_2->setPixmap(QPixmap::fromImage(qt_i));//error line
    // resize the label to fit the image
    ui->label_2->resize(ui->label_2->pixmap()->size());
    label_2.show();


void MainWindow::on_actionOpen_triggered() 
    IplImage *frame = cvLoadImage(
        QFileDialog::getOpenFileName(this, 
                                     "Ouvrir un fichier", 
                                     "/../../Fichiers Image", 
                                     "Image (*.jpg *.bmp *.jpeg)")
                                     .toStdString().c_str(),3);
    IplImage *img_des = cvCloneImage(frame);
    QImage qt_im = IplImage2QImage(img_des);
    QLabel label;
    // display on label
    ui->label->setPixmap(QPixmap::fromImage(qt_im));
    // resize the label to fit the image
    ui->label->resize(ui->label->pixmap()->size());
    label.show();
    filter_image(frame);

主窗口.h

namespace Ui 
    class MainWindow;


class MainWindow : public QMainWindow 
    Q_OBJECT

public:    
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void changeEvent(QEvent *e);

public:
    Ui::MainWindow *ui;

public slots:
    void on_actionOpen_triggered();    
; 

ui_mainwindow.h

#include <QtCore/QVariant>

#include <QtGui/QAction>

#include <QtGui/QApplication>

#include <QtGui/QButtonGroup>

#include <QtGui/QHeaderView>

#include <QtGui/QLabel>

#include <QtGui/QMainWindow>

#include <QtGui/QMenu>

#include <QtGui/QMenuBar>

#include <QtGui/QStatusBar>

#include <QtGui/QToolBar>

#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow


public:
QAction *actionOpen;
QWidget *centralWidget;
QLabel *label;
QLabel *label_2;
QMenuBar *menuBar;
QMenu *menuFile;
QToolBar *mainToolBar;
QStatusBar *statusBar;

void setupUi(QMainWindow *MainWindow)

    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(600, 400);
    actionOpen = new QAction(MainWindow);
    actionOpen->setObjectName(QString::fromUtf8("actionOpen"));
    centralWidget = new QWidget(MainWindow);
    centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
    label = new QLabel(centralWidget);
    label->setObjectName(QString::fromUtf8("label"));
    label->setGeometry(QRect(290, 30, 271, 301));
    label_2 = new QLabel(centralWidget);
    label_2->setObjectName(QString::fromUtf8("label_2"));
    label_2->setGeometry(QRect(20, 20, 281, 331));
    MainWindow->setCentralWidget(centralWidget);
    menuBar = new QMenuBar(MainWindow);
    menuBar->setObjectName(QString::fromUtf8("menuBar"));
    menuBar->setGeometry(QRect(0, 0, 600, 21));
    menuFile = new QMenu(menuBar);
    menuFile->setObjectName(QString::fromUtf8("menuFile"));
    MainWindow->setMenuBar(menuBar);
    mainToolBar = new QToolBar(MainWindow);
    mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
    MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
    statusBar = new QStatusBar(MainWindow);
    statusBar->setObjectName(QString::fromUtf8("statusBar"));
    MainWindow->setStatusBar(statusBar);

    menuBar->addAction(menuFile->menuAction());
    menuFile->addAction(actionOpen);

    retranslateUi(MainWindow);

    QMetaObject::connectSlotsByName(MainWindow);
 // setupUi

void retranslateUi(QMainWindow *MainWindow)

    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
    actionOpen->setText(QApplication::translate("MainWindow", "Open", 0, QApplication::UnicodeUTF8));
    label->setText(QString());
    label_2->setText(QString());
    menuFile->setTitle(QApplication::translate("MainWindow", "File", 0, QApplication::UnicodeUTF8));
 // retranslateUi;



namespace Ui 
class MainWindow: public Ui_MainWindow ;

 // namespace Ui

【问题讨论】:

哪一行导致错误?此外,更好地格式化代码会有很大帮助。 C:/Users/nadia/Desktop/Qt_app/app/mainwindow.cpp:108: 错误: 'ui' 未在此范围内声明 【参考方案1】:

发生错误的方法filter_image不是MainWindow的类方法,因此它无权访问MainWindow的成员(包括ui)。

你可以做几件事:如果有意义,就让它成为MainWindow 类的一部分。或者,您可以将 ui 作为参数传递:

void filter_image(Ui::MainWindow* ui, /*other params*/)...

另外,您正在创建一个局部变量 label_2,而不是从 gui 中获取一个。

【讨论】:

我有这个错误 C:/Users/nadia/Desktop/Qt_app/app/mainwindow.cpp:142: error: cannot convert 'IplImage*' to 'Ui::MainWindow*' for argument ' 1' 到 'void filter_image(Ui::MainWindow*, IplImage*)' 嗯,是的 - 用 filter_image(ui,IplImage*) 调用它,因为现在它需要两个参数。 另请注意,这只是一个 hack,因此您可以对其进行测试。更聪明的是从 filter_image 方法返回一个QImage,这样该函数就不再需要了解 ui 了。从 MainWindow 调用它,取回图像,然后然后显示它。 我认为它正在成功编译,那么。这意味着你正在取得进展。您是否尝试过打印调试消息以找出它崩溃的哪里?另外,正如我在答案中指出的那样,您的本地 QLabel label 可能是问题的根源——它不是 gui 的一部分,毕竟它只是一个局部变量。 当我尝试添加 Ui::MainWindow* ui 时它可以工作,但我还有一个小窗口

以上是关于如何访问在 QtCreator Designer 中创建的 QLabel?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Qt Creator 中加载 qwt_designer_plugin

Qt Designer 停靠小部件儿童访问

Qt:如何将类连接到自定义 Qt 设计器小部件

python+QT designer 做图形化界面EXE程序

如何制作有角度的表格标题?

PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用