【问题标题】:Qt access mainWindow in a class without giving the object to itQt在一个类中访问mainWindow而不给它对象
【发布时间】:2017-10-31 17:01:14
【问题描述】:

我需要访问不同类中的 mainWindow 对象。问题是,我不能把 mainWindow 给这个类(我不想这样做,这会使一切变得更加复杂)。问题:在 C++ 或 Qt 中是否有任何方法可以将对象放入本地“数据库”或项目中的每个其他类都可以查看并与对象通信的地方。 我最终想要的是这样的:

// A.h
#ifndef A_H
#define A_H
class A{
public:
    A() { /*here comes the ting*/ myMainWindow->sayHi(); }
};
#endif // A_H


// MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "a.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    A *a = new A;
}
MainWindow::~MainWindow(){delete ui;}
MainWindow::sayHi(){
    // just do anything
}

我不认为,这是可能的,但我试一试...... 感谢您的回答!

【问题讨论】:

  • 为什么需要 mainWindow 对象?您可以使用信号和插槽从其他类访问 main。 doc.qt.io/qt-4.8/signalsandslots.html
  • 但我需要在 mainWindow 对象本身上调用它。我是我的 mainWindow 类,我实现了一个函数,当我执行只有其他类接收到的操作时,我想执行这个函数,而不是 mainWindow。为了将此类与正确的 mainWindow 插槽连接,我需要实际的 mainWindow 对象
  • 把信号槽连接放在你的主。这是可能的。我对你的项目一无所知,但有可能
  • @mep 访问权限到底是什么意思,是指使用他们的方法之一吗?
  • 是的,这正是我想要的。我无法在主窗口中连接它,因为我尝试在 mainWindow 中调用这个方法的类是在另一个类中创建的,它也不知道 mainWindow

标签: c++ qt class oop object


【解决方案1】:

我需要访问不同类中的 mainWindow 对象。这 问题是,我不能把 mainWindow 给这个类(我不想要 要做到这一点,一切都会变得更加复杂)。

这是可行的。作者不想公开保存对象引用或指针的“主窗口”变量。而且,显然作者希望该 UI 对象可以从其他对象调用。在 Qt 中,这意味着 UI 线程上的两个对象或通信仅通过排队的信号槽连接。但是需要直接调用,因此在同一个线程上。

在 C++ 或 Qt 中是否有任何方法可以将对象放入类似 本地“数据库”或项目中的每个其他类都可以的地方 观察物体并与之交流。

本地线程存储是实现此类事情的一种已知模式。 Qt 有自己的实现,称为QThreadStorage。你可以尝试这样的事情:

// myLts.h
void ltsRegisterObject(const QString &key, QObject *object);
void ltsRemoveObject(const QString &key);
QObject* ltsGetObject(const QString &key);
template <typename T> T* ltsGet(const QString &key) {
     return qobject_cast<T*>(ltsGetObject(key));
}


// myLts.cpp
static QThreadStorage<QMap<QString, QObject*> > s_qtObjects;

void ltsRegisterObject(const QString &key, QObject *object)
{
    s_qtObjects.localData().insert(key, object);
}

void ltsRemoveObject(const QString &key)
{
    if (!s_qtObjects.hasLocalData())
        return;

    s_qtObjects.localData().remove(key);
}

QObject* ltsGetObject(const QString &key)
{
    QObject *object;
    auto it = s_qtObjects.localData().find(key);
    return it != s_qtObjects.localData().end() ? it.value() : nullptr;
}

在 LTS 中注册主窗口对象:

#include "myLts.h"
// ...
// register main window in LTS
ltsRegisterObject("mainWindow", &mainWindow);

查找和使用对象:

#include "myLts.h"
// ...
// use main window from LTS
auto* pMainWnd = ltsGet<QMainWindow>("mainWindow");
if (pMainWnd)
    pMainWnd->show();

附:我没有编译这个。但如果是这样,也不难解决。

【讨论】:

  • 哦,漂亮,谢谢!如果可行的话,这看起来是一个完美的解决方案。我会尝试...
  • 对明显的拼写错误做了 2 处修正。
  • 我在框架文件中遇到四个错误...我猜这是“主要”错误之一:\include\QtCore\qobjectdefs.h:544: 错误:创建指向非类成员函数的指针type 'QMainWindow*' static int test(int (Object::*)(QMetaObject::Call, int, void **)); 老实说,我不知道...
  • 那么该文件中不包含 QMailWindow。 #include &lt;QMainWindow&gt;。你是学生吗?
  • 您是否能够在更改之前编译该项目?
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多