C++ Qt GUI从另一个类访问MainWindow的最简单方法

C++ Qt GUI从另一个类访问MainWindow的最简单方法,c++,qt,qtgui,C++,Qt,Qtgui,我正在做一个21点程序,我在另一个班级的手上记录玩家手中的牌,而不是主窗口班级 在hand类中,对于我收集的每一张卡,我还创建了一个QLabel,用于获取该卡的正确卡图像,并设置该卡在主窗口上显示的位置的坐标 问题是我无法基于最初在main函数中创建的MainWindows对象创建QLabel。有没有什么简单的方法可以让我相当容易地获得这些信息?谢谢你的帮助 我曾尝试过使用QGUI应用程序::topLevelWindows,但在使用它时运气不佳。这是我正在使用的函数 #include &

我正在做一个21点程序,我在另一个班级的手上记录玩家手中的牌,而不是主窗口班级

在hand类中,对于我收集的每一张卡,我还创建了一个QLabel,用于获取该卡的正确卡图像,并设置该卡在主窗口上显示的位置的坐标

问题是我无法基于最初在main函数中创建的MainWindows对象创建QLabel。有没有什么简单的方法可以让我相当容易地获得这些信息?谢谢你的帮助

我曾尝试过使用QGUI应用程序::topLevelWindows,但在使用它时运气不佳。这是我正在使用的函数

    #include <QRect>
    #include <QApplication>
    #include <iostream>
    #include <QLabel>
    #include "mainwindow.h"
    #include <QMainWindow>
    #include <QWindowList>
    #include <QWidgetList>
    #include "ui_mainwindow.h"

    void Test() {

    QList<QWindow*> Main_Window = QGuiApplication::topLevelWindows();
     for (int i = 0; i < Main_Window.size(); ++i) {
        if(Main_Window.objectName() == "mainWindow") // name is OK
                break;
        }
    QMainWindow* mainWindow = static_cast<QMainWindow*>(Main_Window);


    QLabel* temp;
    temp = new QLabel(Main_Window);
    temp->setPixmap(QString("Ten of Clubs.png"));
    temp->setGeometry(290, 300, 350, 390);
    temp->show();

    }
我在网上发现了迭代代码,并且一直存在问题。
我在尝试遍历列表时遇到了问题,但我不知道如何识别列表,错误是没有objectName函数。另外,在静态强制转换行中,有一个错误表示我无法将QList转换为QMainWindow类型。任何帮助都将不胜感激。

通常不可能,因为某些应用程序可能有多个顶级QMainWindow-s,并且它们的列表可能会随时间而变化。因此,对于这种情况,您最好将指针传递给要显式处理的特定QMainWindow

一种可能的方法可能是让您的特定子类是一个单例类,请参见获取其唯一实例,并在应用程序子类中,将要处理的显式窗口作为字段,您甚至可以向应用程序类添加一些新的信号或插槽

但是,您可以使用或获取所有此类窗口的列表。请注意,QWindowList只是一个QList。因此,请参阅以了解如何遍历或迭代该列表

一旦找到所需的QMainWindow,通常会在其中添加一个QLabel,但信号和插槽也会有所帮助

顺便说一句,每个显示的小部件都有自己的窗口,请参见

关于您的代码:

您的主窗口的名称非常糟糕,名称非常混乱,我无法使用它。它是一个列表,而不是一个窗口。因此,代码优先:

QMainWindow* mainWindow = nullptr;
{
  QList<QWindow*> topwinlist = QGuiApplication::topLevelWindows();
  int nbtopwin = topwinlist.size();
  for (int ix=0; ix<nbtopwin; ix++) {
    QWindow*curwin = topwinlist.at(ix);
    if (curwin->objectName() == "mainWindow")
      mainWindow = dynamic_cast<QMainWindow*>(curwin);
  }
} 
并在主体中对其进行适当初始化:


然后在其他地方使用mymainwinp,例如在测试中?如果您想要更优雅的代码,请定义您自己的QApplication子类,并将mymainwinp作为其中的一个字段。

通常不可能,因为某些应用程序可能有多个顶级QMainWindow-s,并且它们的列表可能会随时间而变化。因此,对于这种情况,您最好将指针传递给要显式处理的特定QMainWindow

一种可能的方法可能是让您的特定子类是一个单例类,请参见获取其唯一实例,并在应用程序子类中,将要处理的显式窗口作为字段,您甚至可以向应用程序类添加一些新的信号或插槽

但是,您可以使用或获取所有此类窗口的列表。请注意,QWindowList只是一个QList。因此,请参阅以了解如何遍历或迭代该列表

一旦找到所需的QMainWindow,通常会在其中添加一个QLabel,但信号和插槽也会有所帮助

顺便说一句,每个显示的小部件都有自己的窗口,请参见

关于您的代码:

您的主窗口的名称非常糟糕,名称非常混乱,我无法使用它。它是一个列表,而不是一个窗口。因此,代码优先:

QMainWindow* mainWindow = nullptr;
{
  QList<QWindow*> topwinlist = QGuiApplication::topLevelWindows();
  int nbtopwin = topwinlist.size();
  for (int ix=0; ix<nbtopwin; ix++) {
    QWindow*curwin = topwinlist.at(ix);
    if (curwin->objectName() == "mainWindow")
      mainWindow = dynamic_cast<QMainWindow*>(curwin);
  }
} 
并在主体中对其进行适当初始化:


然后在其他地方使用mymainwinp,例如在测试中?如果您想要更优雅的代码,请定义您自己的QApplication子类,并将mymainwinp作为其中的一个字段。

您能否准确解释如何使用QLabel使用topLevelWindows?我已经试过多次使用它,但没有任何运气。除了在主功能中预先制作的窗口外,我还没有创建任何窗口。这应该进入您的问题,您应该编辑哪个窗口。如果你的代码在上面,你可以在你的问题中提供一个链接。你是对的。我道歉。我已经用我的代码更新了它,并尝试解决它。再次感谢你的帮助!我尝试迭代列表,但没有成功。有什么建议吗?这并不是QT特有的问题:就像其他任何C++类一样,它需要引用其他对象。你能确切地解释如何使用QLabelWindows使用QuePoLWindows吗?我已经试过多次使用它,但没有任何运气。除了在主功能中预先制作的窗口外,我还没有创建任何窗口。这应该进入您的问题,您应该编辑哪个窗口。如果你的代码在上面,你可以在你的问题中提供一个链接。你是对的。我道歉。我已经用我的代码更新了它,并尝试解决它。再次感谢你的帮助!我尝试迭代列表,但没有成功。有什么建议吗?这不成问题 对于Qt来说,M是:像其他任何C++类一样,需要引用其他对象。
 MainWindow*mymainwinp = nullptr;
int main(int argc, char *argv[]) {
  srand(time(NULL));
  QApplication a(argc, argv);
  MainWindow w;
  mymainwinp = &w;
  w.show();
  int r = a.exec();
  mymainwinp = nullptr;
  return r;
}