[英]Qt4: connect slot and signal from other forms
我有一个小问题。 我想从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新手有帮助吗?
我不确定我是否理解您的问题,但请允许我尝试。
您希望能够在另一个类中触发一个插槽。 有几种方法可以做到这一点。
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()
插槽。
这是另一个窗口的简单代码:
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)));
信号将字符串传递到插槽。
在制作信号和插槽时,请记住以下几点:
您需要在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文档 )。 希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.