我正在做一个二十一点程序,我正在跟踪另一个类(" 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类型。任何帮助将不胜感激。
答案 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
作为其中的一个字段。