QT/C++ - 从不同的类访问 MainWindow UI

2024-01-08

我是 C++ 和 Qt 的初学者,所以这也许是微不足道的。当然感觉应该很简单,但我已经寻找答案几个小时了,但找不到解决方案。我正在制作一个简单的棋盘游戏,其中 MainWindow 的 ui(用 QtDesigner 制作)包含游戏板的画布(QGraphicsView)。现在,main.cpp 非常简单:

MainWindow Game;

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);

 Game.show();

return a.exec();
}

由于我需要从另一个完全不相关的类访问和编辑 MainWindow Widget,我认为最简单的方法是将 MainWindow 设为全局变量。然而,这种做法似乎是非常错误的。尝试在 QtDesigner 中运行该项目时,我收到 Microsoft Visual C++ 运行时库错误:应用程序已请求运行时以异常方式终止它。

那么做我需要的事情的正确方法是什么?

除了主窗口之外,我还有一个新游戏的对话框(QDialog,从 QtDesigner 生成),单击主窗口中的菜单项后会显示该对话框。当用户输入游戏的所有参数并在对话框中单击“确定”时,我会实例化一个名为 GameState 的自定义非 Qt 类。这个类的目的是操作游戏本身,绘制棋盘,提示用户等。但是,由于这个类是在 QDialog 中创建的,它不知道 MainWindow 的存在,所以我无法对 MainWindow 做任何事情从这个班级。那么,如何从不相关的类修改 MainWindow 呢?

另外,setEnabled() 函数是如何工作的?它似乎从来没有做任何事情。我在 QtDesigner 中设置为禁用的任何小部件,然后尝试通过此功能启用,但在 GUI 中仍然保持禁用状态...


首先,创建一个坏主意MainGame在你创建你的之前QApplication目的。 如果你想拥有你的MainGame像这样全局可用的对象应该是一个指针:

MainWindow *Game;
int main (int argc, char **argv)
{
  QApplication a (argc, argv);

  Game = new MainWindow();
  Game->show();

  int result = a.exec();

  delete Game;
  Game = NULL;

  return result;
}

然而,这种方法并不是最优雅的。有两个更好的选择。

  1. The QApplication对象实际上存储了所有顶级窗口,例如您的MainGame这意味着您始终可以通过以下方式获取它QApplication::topLevelWidgets()这是一个静态函数,返回包含所有顶级小部件的列表。由于您只有一个,因此第一个是您的MainGame。缺点是你必须强制转换它,但是使用 Qtsqobject_cast<MainGame*>(...)是相当安全的。不过,您必须检查结果以确保它不是 NULL 指针。

  2. 使用单例设计模式。您应该将全局 Game 指针存储在 Game 类本身(子类)的源 (cpp) 文件中QMainWindow)并且您的 Game 类应该实现一个返回此全局指针的静态公共方法。所以如果任何其他类需要Game指针,它只是调用:

    MyGame *theGame = MyGame::getInstance();
    

    例如。

关于你的setEnabled()问题。请贴出相关代码。如果太多,请随时通过邮件向我发送 *.ui 文件和代码段。

此致
D

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT/C++ - 从不同的类访问 MainWindow UI 的相关文章

随机推荐

  • Python 在 Javascript / jQuery 中的部分等效

    Python 的等价物是什么functools partial https docs python org 2 library functools html functools partial在 JavaScript 或 jQuery 中
  • 未找到 IPython 命令 OSX 终端。点安装

    使用通过自制程序安装的 Python 2 7 然后我使用 pip 安装 IPython 因此 IPython 似乎安装在 usr local lib python2 7 site packages 我认为这是真的 因为有一个 IPython
  • 如何保护 ASP.NET_SessionId cookie 的安全?

    我已将 ASPXAUTH cookie 设置为仅 https 但我不确定如何有效地对 ASP NET SessionId 执行相同操作 整个站点使用 HTTPS 因此 cookie 无需同时适用于 http 和 https 要添加 secu
  • 为什么“queueInputBuffer”中的“MediaCodec CodecException”仅发生在 Android API 29 上?

    基本信息 目标SDK版本28 Goal 课程的目标是在发送到我的服务器之前调整视频大小 Problem 应用程序仅在 API 29 上崩溃 无论是使用真实设备还是使用 AVD 例如 该代码可以正常工作像素 2 API 28 但不是在像素 2
  • 使用 CoreText 显示 NSAttributedString

    我听说我可以使用 CoreText 显示 NSAttributedString 有人能告诉我如何 最简单的方法 吗 请不要使用 CATextLayer 或 OHAttributedLabel 进行回答 我知道这个论坛有很多关于这个的问题 但
  • webdriver.Dispose()、.Close() 和 .Quit() 之间的区别

    这些有什么区别 Webdriver Close Webdriver Quit Webdriver Dispose 何时使用哪一个 这是一个很好的问题 我见过人们在不应该使用 Close 的情况下使用 Close 我查看了 Selenium
  • 在 VBA 中触发完整计算

    给定一个包含大量公式的工作簿 我意识到当其单元格值是最新的时 F9 ActiveWorkbook Calculate or Sheets 1 calculate不会触发重新计算 但是 如果另一个单元格通过公式引用的单元格值发生变化 F9 A
  • rand() 即使在 srand(time(NULL)) 之后也不会生成随机数

    我正在尝试使用循环调用类函数 for int i 0 i lt Basket getLemonNum i lemonWeights i Fruit generateWeight fruit fruitWeight cout lt lt le
  • Kendo UI Web 和 Kendo UI ASP.NET for MVC 之间的区别

    通过 Visual Studio 创建 MVC 项目时 视图是使用 cshtml 文件创建的 KendoUI Server Wrappers 在视图中有一个模型 而 KendoUI Web 不仅没有任何模型 而且没有 cshtml 文件 仅
  • 使用 raise_application_error 的 PL SQL 触发器会引发错误。

    我有一些代码需要帮助调试 但我觉得如果我能让其中一个运行 我就能得到其余的 哦 我多么希望 create or replace trigger minimumwage before insert or update on Employee
  • BLE 设备可以充当信标吗

    这可能是一个错误的问题 但只需要知道这是否可行 对于我们的一款 BLE 设备 制造商数据是使用使用 peripheral advertisement manufacturerData manufacturerData
  • Json 架构文件不会在 BigQuery Python API 中执行

    我在使用 Bigquery Python API 时遇到问题 这是我执行脚本时的堆栈跟踪 Traceback most recent call last File createTable py line 17 in
  • 当目标(后端)应用程序在同一 EC2 的多个端口上运行时的 AWS ELB

    我有 2 个相同 Web 应用程序的实例在端口 8080 和 8081 上运行 我需要使用 ALB CLB 进行负载平衡 这在旧的 apache Web 服务器中曾经是一件简单的事情 要求是对下面的实例进行负载平衡 实例 1 Web 应用程
  • 在图像上使用文本塑造形状

    所以我想使用 CSS 在图像上放置一个三角形 确切地说是一个包含一些文本的三角形 像这样的事情 https sketch io render sk 11fa7e2aeba09cb08372f831f84d9af2 jpeg https sk
  • 在React JS中实现状态变化时的过渡效果

    我的 React 页面上有一张图像 当状态更新为新图像时我想执行以下过渡效果 原始图像应该放大和淡出 新图像还应该放大和淡入 效果应该类似于穿过墙壁到达新场景 我怎样才能在 React 中做到这一点 正如 pgsandstrom 提到的 反
  • 使
  • 元素拉伸得比包含的
  • 目前 我正在开发一个工作布局 但我对动态下拉菜单有点困惑 我在 li 元素中使用子 ul 该元素将显示导航链接的子项 但上面的 li 因此是主要的 您将鼠标悬停在其上以查看子项 延伸到 ul 的长度 当然是由其中的 li 元素的宽度定义的
  • 如何使用KeyEventDispatcher

    我一直在尝试制作一个 Pong 克隆作为初学者的项目 但我遇到了障碍 我已经设法达到键盘支持的目的 但是键盘重复延迟开始出现 我还没有找到任何可用的方法来使用 KeyEventDispatcher 它甚至不会启动dispatchKeyEve
  • 使用 boto3 列出 100 多个堆栈

    我们需要列出所有处于 CREATE COMPLETE 状态的堆栈 在我们的 AWS 账户中 我们有超过 400 个这样的堆栈 我们为此编写了以下代码 stack session session client cloudformation l
  • 正向回顾与非捕获组:不同的行为

    我使用 python 正则表达式 remodule 在我的代码中并注意到在这些情况下的不同行为 re findall r s a z a xyz b abc non capturing group results in a xyz b ab
  • QT/C++ - 从不同的类访问 MainWindow UI

    我是 C 和 Qt 的初学者 所以这也许是微不足道的 当然感觉应该很简单 但我已经寻找答案几个小时了 但找不到解决方案 我正在制作一个简单的棋盘游戏 其中 MainWindow 的 ui 用 QtDesigner 制作 包含游戏板的画布 Q