C++ C++/Qt从Qt//中的另一个类访问ui的正确方法
我正在尝试访问在MainWindow类中是私有的ui成员 我想在从gl小部件释放鼠标按钮(带有鼠标移动量)时更新lineEdit(Xvaldisp) 在搜索了一下之后,我发现我需要在mainwindow中创建一个函数/方法 然后从我的GLWidget通过指向Mainwindow的指针访问它 问题: lineEdit保持为空,应该更新它的方法(displaymessage())似乎被调用 为了检查我是否创建了一个字符串(str)以查看是否调用了displaymessage,当调用displaymessage()时,将使用一个新值更新此字符串 displaymessage()下面的on_Button_clicked()方法在单击按钮时也会更新相同的lineEdit,并且工作正常 它显示str的内容 这是我的密码: glwidget.hC++ C++/Qt从Qt//中的另一个类访问ui的正确方法,c++,qt,C++,Qt,我正在尝试访问在MainWindow类中是私有的ui成员 我想在从gl小部件释放鼠标按钮(带有鼠标移动量)时更新lineEdit(Xvaldisp) 在搜索了一下之后,我发现我需要在mainwindow中创建一个函数/方法 然后从我的GLWidget通过指向Mainwindow的指针访问它 问题: lineEdit保持为空,应该更新它的方法(displaymessage())似乎被调用 为了检查我是否创建了一个字符串(str)以查看是否调用了displaymessage,当调用displayme
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QGLWidget>
#include <QTimer>
#include <QMouseEvent>
#include "mainwindow.h"
#include <QObject>
#include <QLineEdit>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent = 0);
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
private:
QTimer timer;
QPoint pointMpressed;
QPoint diff;
protected:
signals:
void valueCh();
};
#endif // GLWIDGET_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLineEdit>
#include <QObject>
#include "glwidget.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void on_Button_clicked();
void displayMessage();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
问题的根源在于你似乎误解了指针的概念。具体来说,调用
new
并不是获取指针的唯一方法-指针只是一个保存某个对象(或函数)地址的变量。new
操作符返回指向动态分配对象的指针,但也有其他方法,其中至少有三种与您相关:1) 让别人给你一个指针,例如作为函数参数
2) 使用
和获取对象的地址。
3) 使用此
获取指向当前正在使用的对象的指针
现在我们已经解决了这个问题,请看一下您的代码<代码>主窗口
有两个插槽:
class MainWindow : public QMainWindow {
Q_OBJECT
...
public slots:
void on_Button_clicked();
void displayMessage();
插槽是成员函数-在对象上调用它们
当您创建类型为MainWindow
的对象时,您的MainWindow
对象的按钮上单击的插槽会自动连接到按钮的单击的信号(通过元对象编译器,这是Qt特有的东西,因为您使用了特定的命名约定)
另一个怎么办?这是你的代码:
void GLWidget::mouseReleaseEvent(QMouseEvent *e){
MainWindow *mwd;
mwd= new MainWindow;
QObject::connect(this, SIGNAL(valueCh()), mwd ,SLOT(displayMessage()) );
emit valueCh();
delete mwd;
}
您不是连接到原始主窗口的插槽,而是创建一个新对象,调用它的函数,并立即销毁它。因此,虽然插槽
会被调用,但实际上是您的gui的对象不会被调用
发生这种情况是因为您认为需要一个指向MainWindow对象的指针,并使用了new
来获得一个。问题是,该指针没有指向您真正关心的对象(即实际的gui
)
一个(不美观的)解决方案是不创建新的主窗口,而是将原始主窗口的地址传递给小部件,并在连接语句中使用该地址(指针)
更好的解决方案是跳过所有这些内容,按照预期的方式使用信号和插槽,这样单个小部件就不必知道它们所连接的对象的任何信息
将main窗口的构造函数更改为以下内容:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->glWidget, SIGNAL(mouseReleaseEvent()),this,SLOT(displayMessage()));
}
除了GLWidget::displayMessage
中的emit
语句外,其他所有内容都已被mwd初始化。从您的代码来看,它似乎不是。您需要将指向现有主窗口的指针传递到glwidgetHanks以获取注释我将如何做?对cpp类真的不熟悉,需要仔细阅读它AsasPube可能与上面描述的初始化有问题…但是,您也应该考虑将<代码>信号>代码>从<代码> GLIDGET< <代码>到<代码>时隙<代码> <代码>主窗口< /代码>,而不是传递一个指针。可能的感谢的副本,我已经怀疑我没有得到原始地址的地址。nWindows我仍然不太理解OOP的概念它有点模糊,但也许我会在几年内达到这一点,我不得不改变一些东西以使你发布的内容正常工作,但它现在工作得很好,而不是“连接”(ui->glWidget,SIGNAL(mouseReleaseEvent()),这个,SLOT(displayMessage());我使用了“连接”(ui->glWidget,SIGNAL(valueCh()),这个,SLOT(displayMessage());`and emitvalueCh();
现在工作得很好,我很高兴:)
void GLWidget::mouseReleaseEvent(QMouseEvent *e){
MainWindow *mwd;
mwd= new MainWindow;
QObject::connect(this, SIGNAL(valueCh()), mwd ,SLOT(displayMessage()) );
emit valueCh();
delete mwd;
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->glWidget, SIGNAL(mouseReleaseEvent()),this,SLOT(displayMessage()));
}