来自另一个类的 Qt 方法调用?

Posted

技术标签:

【中文标题】来自另一个类的 Qt 方法调用?【英文标题】:Qt method call from another class? 【发布时间】:2014-05-10 13:11:16 【问题描述】:

我有两个窗口(两个类),一个窗口在我单击按钮时打开另一个窗口。

然后用户在新打开的窗口中输入一些内容,然后在单击按钮时将该信息传输到第一个窗口

问题是我似乎无法将某些内容发送到第二个窗口,因此我可以将用户输入发送回主窗口。我阅读了一些我应该使用 Q_object 的地方,但不确定它是如何工作的

我应该提一下,我是 Qt 的新手,在我开始使用该程序之前,我并不知道 qt creator 中的设计师。

希望您对我如何做到这一点有一些想法

编辑1:

我应该显示我拥有的相关代码

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)

//alot of stuff not relevant right now creating different stuff
changeProfile= new QPushButton("ændre valgte profil",this);
profileList = new QComboBox(this);
cProfile = new CreateProfile;
connect(changeProfile,SIGNAL(clicked()),this,SLOT(ProfileChange()));


void MainWindow::ProfileChange()

    file pfile(profileList->currentText().toStdString());
    string tempName = pfile.read(light);

    cProfile->setValue(light,tempName);
    cPr

ofile->show();

void MainWindow::setProfileList(QString Pname_)

    bool found = 0;
    for (int i = 0;i<5;i++)
    
        if (Pname_ ==profileList->itemText(i))
            found = 1;
    
    if (found !=1)
        profileList->addItem(Pname_);

createProfile.cpp

CreateProfile::CreateProfile(QWidget *parent)
    :QMainWindow(parent)

//alot of other irrelevant stuff here
saveP = new QPushButton("Save",this);
connect(saveP,SIGNAL(clicked()),this,SLOT(saveProfile()));

void CreateProfile::saveProfile()

temp = pName->text();
file pFile(temp.toStdString());
bool lights[2] = light1->checkState(),light2->checkState();
if (temp.length() == 0)

    MessageBox(NULL,"Du har ikke skrevet noget navn ind\n Prov igen","Error",MB_ICONWARNING+MB_SETFOREGROUND);

else

    pFile.save(lights);
    //call function setProfileList
    this->hide();


如果有道理,如果您也需要 .h 文件,我也可以显示它们

我需要从函数 saveprofile 的主窗口调用setProfileList(在 createprofile 窗口中有),或者如果有办法我可以从 createprofile 窗口更改 wainwindow 中的组合框?

编辑 2:

ma​​inwindow.h

#include "createprofile.h"
class MainWindow : public QMainWindow

    Q_OBJECT
public slots:
void ProfileChange();
//some other button clicks
public:
    CreateProfile *cProfile;
    void setProfileList(QString Pname_);
//other irelevant stuff

    private:
    // and some private members
    ;

createProfile.h

class CreateProfile : public QMainWindow

    Q_OBJECT
public slots:
    void saveProfile();
public:
    explicit CreateProfile(QWidget *parent = 0);
~CreateProfile();
//and other stuff there isnt relevant
;

【问题讨论】:

【参考方案1】:

您正在寻找Qt signal-slot mechanism,即:

class SecondWindow : public QMainWindow

    Q_OBJECT
    public:

    SecondWindow(QWidget *parent = Q_NULLPTR) : QObject(Q_NULLPTR)
    
        // ...
        connect(secondWindowButton, SIGNAL(clicked(bool)), SLOT(handleClicked()));
        // ...
    

public slots:
    void SecondWindow::handleClicked()
    
        // Gather information from the UI as you wish
        firstWindow->foo();
    
    // ...

或者,如果你有一个用于 windows 的容器类,你也可以在那里处理它,如下所示:

connect(secondWindow->myButton, SIGNAL(clicked(bool)), SLOT(handleClicked()));

【讨论】:

嗯不确定你是否完全理解我想要做的事情(或者我不理解你:))我发布了我的 .cpp 文件可能有助于清理它 @Sumsar1812:cProfile = new CreateProfile(this);,然后是另一个班级的parent()-&gt;setProfileList() 嗯嗯,我之前试过,但现在使用 () 确实给我一个错误error: C2039: 'setProfileList' : is not a member of 'QObject' 我正在传递一个QString parent()-&gt;setProfileList(temp); @Sumsar1812:您是否尝试过将 parent() 的返回值 qobject_cast 到您的班级? mainWindow = qobject_cast&lt;MainWindow*&gt;(parent()) if (mainWindow) mainWindow-&gt;setProfileList(temp);,但最好是从容器类中管理这些窗口,真的。【参考方案2】:

我发现了一种非常不同的方法来做到这一点,所以我在createProfile.cpp 的构造函数中创建了一个QComboBox,然后我可以通过这种方式访问​​profileList。

【讨论】:

这个答案对我来说没有意义。您想访问 setProfileList 这是一种方法。在另一个类中拥有一个数据成员并没有真正的帮助。在这一点上,我恐怕无法理解你的回答。 哦,是的,但正如我之前所说的“或者如果有办法我可以更改组合框......”所有这个功能所做的只是改变组合框,我认为我无法访问另一个成员所以我最终做了一个函数来代替我做这个,希望我可以在另一个类中使用这个函数。希望有道理 好的,我明白了。我仍然不确定为什么你有两个主窗口。听起来很奇怪。你能详细说明一下吗? 我对 Qt(和一般编程)非常陌生,在你告诉我之前我不知道我有 2 个主窗口。这正是我从第一个窗口中知道的方式,所以我认为它与第二个窗口基本相同:P 我想你希望有一个主窗口,然后里面有小部件。

以上是关于来自另一个类的 Qt 方法调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 appDomain 调用类的方法

来自 void 类的模拟异步调用

从另一个类调用委托方法

从另一个 std::thread 调用 Qt 对象方法

如何在C#中,在一个类里调用另外一个类的方法

PHP怎么调用其他类的方法