Qt:使用信号和插槽从另一个类调用MainWindow::Ui
Qt: Calling MainWindow::Ui from another class using signals and slots
我做了一个简单的Qt项目来解决从另一个类调用Ui的问题
文件:
mainwindow.h|mainwindow.cpp|client.h|client.cpp|main.cpp
问题:
将信号从client.cpp连接到主窗口.cpp中的插槽效果非常好
但是当我添加一个
ui->statusBar->showMessage("message")时在插槽中,它不起作用
注意:当我在mainwindow.cpp中创建信号和插槽时,它起作用,但从client.cpp中的信号和connect()调用mainwindow.cpp的插槽不起作用
代码:(修剪到要点)
主窗口.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
signals:
public slots:
void doSomething();
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
void MainWindow::doSomething()
{
QMessageBox::information(0, "test", "BINGO!!");
ui->statusBar->showMessage("testing");
}
client.h
class client : public QObject
{
Q_OBJECT
public:
explicit client(QObject *parent = 0);
void call();
signals:
void connected();
public slots:
};
client.cpp
client::client(QObject *parent) :
QObject(parent)
{
MainWindow main;
connect(this, SIGNAL(connected()), &main, SLOT(doSomething()));
call();
}
void client::call()
{
emit connected();
}
添加:
main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
谢谢。
client::client(QObject *parent) :
QObject(parent)
{
MainWindow main;
connect(this, SIGNAL(connected()), &main, SLOT(doSomething()));
call();
}
您的MainWindow位于堆栈上。我认为当你的doSomething槽被触发时,MainWindow对象已经不见了。请尝试在堆上创建MainWindow。
我在您发布的代码中发现了一个重大错误。
您已经在文件main.cpp中创建了MainWindow
的实例,这就是您运行应用程序时看到的窗口。但是在client.cpp中,您正在创建MainWindow
的第二个实例,并将来自client
对象的信号连接到您创建的第二MainWindow
对象的插槽。您没有看到两个主窗口,因为您没有运行第二个实例的exec
或show
方法。
现在进入解决方案,您必须将信号从client
连接到适当的MainWindow
实例。我将在下面建议两种方法。
第一个:
我相信您在类MainWindow
的一个成员函数中创建了client
的实例。如果是,则将连接方法转移到文件mainwindow.cpp
类似于:
void MainWindow::someFunction()
{
client* c = new client();
connect(c, SIGNAL(connected()), this, SLOT(doSomething()));
c->call();
}
第二个:
如果不能执行上面解释的操作,那么可以使用静态指针和静态函数的组合来获取MainWindow
的实例。请注意,此方法也可用于确保在任何给定时间只有一个MainWindow
实例。
主窗口.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
signals:
public slots:
void doSomething();
public:
explicit MainWindow(QWidget* parent = 0);
~MainWindow();
static MainWindow* GetInstance(QWidget* parent = 0);
private:
Ui::MainWindow *ui;
static MainWindow* mainInstance;
};
主窗口.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow* MainWindow::mainInstance = 0;
MainWindow* MainWindow::GetInstance(QWidget *parent)
{
if(mainInstance == NULL)
{
mainInstance = new MainWindow(parent);
}
return mainInstance;
}
void MainWindow::doSomething()
{
QMessageBox::information(0, "test", "BINGO!!");
ui->statusBar->showMessage("testing");
}
现在,在任何需要使用MainWindow实例的类中,只需使用静态函数MainWindow::GetInstance
获取指向MainWindow
实例的指针,并将其用作连接的参数。即
MainWindow* instance = MainWindow::GetInstance();
client* c = new client();
connect(c, SIGNAL(connected()), instance , SLOT(doSomething()));
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 在另一个线程中调用luaL_error会引发qWarning
- 如何在qt中从另一个类调用函数
- 检查哪个对象调用了另一个对象的对象方法
- 如何确定哪个标头调用 c++ 中的另一个标头
- 在另一个函数 (c++) 中调用变量
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- 如何从另一个标头 c++ 调用函数
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 使用指向成员函数的指针在另一个类中调用类构造函数
- 从另一个标头中的标头调用静态方法
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 在模板化的 Rcpp 函数中调用另一个 cpp 函数
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 当另一个调用 lambda 使用默认捕获时,lambda 的闭包可能会被破坏吗?
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效