如何访问在 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
python+QT designer 做图形化界面EXE程序
PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用