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

时间:2017-02-18 00:44:56

标签: c++ qt qtgui

我正在做一个二十一点程序,我正在跟踪另一个类(" hand.h")中玩家手中的牌而不是主窗口类。

在手工课程中,对于我收集的每张卡片,我还创建了一个QLabel,用于抓取卡片的正确卡片图像,并设置卡片在主窗口上的显示位置。

问题是我无法根据最初在main函数中创建的MainWindows对象创建QLabel。有没有简单的方法可以很容易地获得这些信息?谢谢你的帮助!

我尝试过使用QGuiApplication :: 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();

    }

这是创建主窗口的main.cpp文件

    int main(int argc, char *argv[])
    {
      srand(time(NULL));
      QApplication a(argc, argv);
      MainWindow w;

      w.show();
      return a.exec();
    }

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

1 个答案:

答案 0 :(得分:4)

通常没办法,因为某些应用程序可能有几个(toplevel)QMainWindow - s(并且它们的列表可能会随时间而变化)。因此,对于这种情况,您最好明确地将指针传递给它(您想要处理的特定QMainWindow)....

一种可能的方法可能是拥有QApplication的特定子类(这是一个单例类,请参阅QCoreApplication::instance以获取其唯一实例)并在您的应用程序子类中作为字段放置显式你想要处理的窗口(也许你甚至想在你的应用程序类中添加一些新的信号或插槽)。

但是,您可以使用QGuiApplication::topLevelWindows()QGuiApplication::allWindows()来获取所有此类窗口的列表。请注意,QWindowList只是QList<QWindow *>。所以请参阅QList了解如何遍历或迭代该列表。

找到所需的QMainWindow后,通常会在其中添加QLabel(但同样,信号和插槽可能会有所帮助)。

顺便说一句,每个(显示的)小部件都有它的窗口,请参阅QWidget::window()

关于您的代码:

你的Main_Window命名真的很糟糕(名字太混乱了,我不能用它)。它是列表而不是窗口。所以代码首先:

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);
  }
} 

我没有测试上面的代码,我不确定它是否正确甚至可以编译。但是你为什么不只有一个指向主窗口的全局指针:

 MainWindow*mymainwinp = nullptr;

并在main正文中正确初始化:

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;
}

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