我有小问题。我想在AnotherWindow的MainWindow中运行函数。我不能为它设置connect()
。
Main class: MainWindow
Other form: AnotherWindow
Function in main class: setVariable(QString)
Function in other form: btnClicked()
我现在已连接按钮信号clicked()
:
// In AnotherWindow.cpp
connect(ui->btnOK, SIGNAL(clicked()), this, SLOT(btnOkClicked()));
// Function in same file
void interfaceWindow::btnOkClicked() {
/* Some actions - emit signal? */
this->close();
}
btnOkClicked()
被声明为私人广告位。
// In MainWindow.cpp
void MainWindow::setVariable(QString _var) {
this->var = _var;
}
setVariable(QString)
被声明为公共广告位。
如何从AnotherForm(从btnOkClicked()
函数)向MainWindow(setVariable(QString)
函数)发送变量?我必须如何以及在何处发送信号并建立联系?
我对信号和插槽有所了解,但我的代码不起作用 - 我不在这里粘贴,因为它很糟糕:)
Qt newbie有什么帮助吗?
答案 0 :(得分:0)
我不完全确定我理解你的问题,但让我试一试。
您希望能够在另一个类中触发一个插槽。有几种方法可以做到。
protected
和private
变量/成员例如,
class MainWindow {
private slot:
void setVariable(QString);
}
class AnotherWindow {
friend class MainWindow;
MainWindow *window;
public:
AnotherWindow() {
connect(this, SIGNAL(fire(QString)), window, SLOT(setVariable(QString)));
}
signals:
void fire(QString);
public slots:
void onButtonClicked() {
emit fire(QString);
}
}
以前是伪代码,所以不要指望它编译。我认为这就是你想要的。基本上,由于您的广告位在MainWindow
上是私密的,因此您需要将其设为好友。要连接,它需要是一个成员。然后,当onButtonClicked
广告位被引发时,fire()
位于setVarialbe()
广告位。
答案 1 :(得分:0)
以下是另一个窗口的简单代码:
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget * parent = 0)
{
okBtn = new QPushButton ("I am Ok!");
MyData = "";
connect(okBtn ,SIGNAL(clicked()),this,SLOT(OnOk()));
}
~MyWidget();
private:
QString MyData;
QPushButton * okBtn;
//something that modify string MyData
signals:
void MyDataSignal(QString);
//Internal slot that emits signal with proper data
private slots:
void OnOk()
{
if(MyData!="")
{
emit MyDataSignal(MyData);
}
}
};
现在在MainWindow中创建一个MyWidget对象(假设为myWid)并将其连接到插槽
connect(myWid, SIGNAL(MyDataSignal(QString)),this,SLOT(OnMyWidOkClicked(QString)));
信号将字符串传递给插槽。
在制作信号和插槽时,请注意以下几点:
答案 2 :(得分:0)
您需要在MainWindow中引用AnotherWindow,反之亦然。然后你需要以下东西:
// AnotherWindow.h
signals:
void buttonOkClickedSignal(QString var);
// AnotherWindow.cpp
void interfaceWindow::btnOkClicked() {
emit buttonOkClickedSignal("The button got clicked!");
this->close();
}
下一步根据MainWindow是否引用AnotherWindow或反之亦然而有所不同。你可以:
// AnotherWindow.cpp
connect(this, SIGNAL(buttonOkClickedSignal(QString), &mainWindow, SLOT(setVariable(QString)));
或:
// MainWindow.cpp
connect(&anotherWindow, SIGNAL(buttonOkClickedSignal(QString), this, (SLOT(setVariable(QString)));
如果您通过信号调用插槽,那么它是私有的还是公共的(参见Qt Documentation)并不重要。 希望这会有所帮助。