我有两个窗口(两个类),一个窗口在我点击按钮时打开另一个窗口。
然后用户在新打开的窗口中输入内容,然后在单击按钮时将该信息传输到第一个窗口
问题是我似乎无法向第二个窗口发送内容,因此我可以将用户输入发送回主窗口。我读了一些我应该使用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
};
答案 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。