从另一个类调用Qt方法?

时间:2014-05-10 13:11:16

标签: c++ qt qtgui qmainwindow qt-signals

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

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

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

我应该提一下,我是Qt的新手,并且在我开始推进该计划之前,他并不了解qt creator中的设计师。

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

EDIT1:

我应该显示我的相关代码

Mainwindow.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中的mainwindow中调用setProfileList(在createprofile窗口中)或者是否有办法可以从createprofile窗口更改wainwindow中的组合框?

编辑2:

mainwindow.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
};

2 个答案:

答案 0 :(得分:3)

您正在寻找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()));

答案 1 :(得分:0)

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