【问题标题】:Qt: Calling MainWindow::Ui from another class using signals and slotsQt:使用信号和槽从另一个类调用 MainWindow::Ui
【发布时间】:2014-09-27 20:10:31
【问题描述】:

我做了一个简单的 Qt 项目来解决从另一个类调用 Ui 的问题。

文件:
主窗口.h |主窗口.cpp |客户端.h |客户端.cpp | main.cpp

问题:
client.cpp 中的信号连接到 mainwindow.cpp 中的插槽效果很好。
但是当我添加了一个

ui->statusBar->showMessage("message");
在插槽中,它不起作用。
注意:当我在 mainwindow.cpp 中制作信号和插槽时,它可以工作,但是从信号和 connect() 调用 mainwindow.cpp 中的插槽client.cpp 中的 不起作用。

代码:(精简为基本内容)

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

谢谢。

【问题讨论】:

  • 请发布您的 main.cpp,谢谢。
  • 好的,已编辑帖子
  • 那么...您在哪里创建和使用客户端对象?看起来客户端上的代码从未运行过。
  • 我有另一个大项目这样做,但我做了一个小项目来解决这个问题,客户端的代码运行,消息框也运行,但用户界面没有。所以这就是问题所在。
  • 好的。所以 MainWindow 上的 doSomething 插槽肯定被调用了——你看到消息框了吗?问题是以下行似乎没有被执行,并且您在状态栏中没有看到任何变化?

标签: c++ qt


【解决方案1】:
client::client(QObject *parent) :
    QObject(parent)
{
    MainWindow main;
    connect(this, SIGNAL(connected()), &main, SLOT(doSomething()));
    call();
}

您的 MainWindow 位于堆栈中。我认为当你的 doSomething 插槽被触发时, MainWindow 对象已经不复存在了。尝试在堆上创建 MainWindow。

【讨论】:

  • 抱歉问你这个愚蠢的问题:如何?
  • 看看stackoverflow.com/questions/599308/…。您需要使用new 并存储指向MainWindow 的指针。将客户端作为 MainWindow 的父级传递,当客户端对象被销毁时,Qt 将负责在 MainWindow 之后进行清理。
  • 我按照你说的做了,“MainWindow *main = new MainWindow;”但仍然是同样的问题。
【解决方案2】:

我发现您发布的代码中有一个重大错误。

您在文件 main.cpp 中创建了MainWindow 的实例,这就是您在运行应用程序时看到的窗口。但是在您的 client.cpp 中,您正在创建 MainWindow 的第二个实例,并将来自 client 对象的信号连接到您创建的第二个 MainWindow 对象的插槽。您没有看到两个主窗口,因为您没有运行第二个实例的 execshow 方法。

现在解决问题,您必须将来自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()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多