C++ C++/Qt从Qt//中的另一个类访问ui的正确方法

C++ C++/Qt从Qt//中的另一个类访问ui的正确方法,c++,qt,C++,Qt,我正在尝试访问在MainWindow类中是私有的ui成员 我想在从gl小部件释放鼠标按钮(带有鼠标移动量)时更新lineEdit(Xvaldisp) 在搜索了一下之后,我发现我需要在mainwindow中创建一个函数/方法 然后从我的GLWidget通过指向Mainwindow的指针访问它 问题: lineEdit保持为空,应该更新它的方法(displaymessage())似乎被调用 为了检查我是否创建了一个字符串(str)以查看是否调用了displaymessage,当调用displayme

我正在尝试访问在MainWindow类中是私有的ui成员

我想在从gl小部件释放鼠标按钮(带有鼠标移动量)时更新lineEdit(Xvaldisp)

在搜索了一下之后,我发现我需要在mainwindow中创建一个函数/方法 然后从我的GLWidget通过指向Mainwindow的指针访问它

问题:

lineEdit保持为空,应该更新它的方法(displaymessage())似乎被调用

为了检查我是否创建了一个字符串(str)以查看是否调用了displaymessage,当调用displaymessage()时,将使用一个新值更新此字符串

displaymessage()下面的on_Button_clicked()方法在单击按钮时也会更新相同的lineEdit,并且工作正常 它显示str的内容

这是我的密码:

glwidget.h

#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 emit
valueCh();
现在工作得很好,我很高兴:)
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()));

}