【问题标题】:Swap Qt Widgets交换 Qt 小部件
【发布时间】:2015-03-02 00:44:32
【问题描述】:

我遇到了问题。我想交换两个 Qt 小部件:

void swap(QMainWindow **w1, QMainWindow **w2)
{
    QMainWindow *w3;

    w3 = *w1;
    *w1 = *w2;
    *w2 = w3;
}

但是,如果我有widget1 类型为MainWindow1*widget2 类型为MainWindow2* 并且我调用swap(&widget1, &widget2); 我得到

/home/user/Test/manager.cpp:24: error: invalid conversion from 'MainWindow1**' to 'QMainWindow**' [-fpermissive]
  swap(&widget1, &widget2);
       ^

我必须注意MainWindow1MainWindow2 是两个QMainWindow 派生类。

我的问题是:是否可以创建一个在运行时交换两个多态对象的函数?我该如何解决这个问题?

非常感谢!

【问题讨论】:

  • 我没用过Qt。QMainWindow类是否实现了赋值运算符功能?如果答案是肯定的,你可以。我建议你检查API
  • 请注意 C++ 中的 std::swap already exists(如果您是 #include <algorithm>)。你不必自己写。但是您在这里提出的问题违反了 C++ 的静态类型系统原则。所有变量的类型在编译时都是固定的……包括指针。如果您需要可以容纳不同指针的东西,您可以使用类型化联合......但这可能意味着您的设计是错误的。对于这些窗口的共同点,您可能只需要从 QMainWindow 派生的另一个中间基类。
  • @RonTang 不幸的是,没有 QObject 类,因此 QMainWindow 实现了赋值运算符或复制构造函数。这是 Qt 的设计。所以这是不可能的......
  • @HostileFork 我知道std::swap,谢谢。我只是在这个测试应用程序中忘记了它:)

标签: c++ qt polymorphism swap qobject


【解决方案1】:

您不应该像下面那样传递 MainWindow1MainWindow2 指针来交换。

MainWindow1* w1 = new MainWindow1();
MainWindow2* w2 = new MainWindow2();
swap(&w1, &w2);

如果在这种情况下可能发生交换,MainWindow1 指针将指向MainWindow2 对象,这是不对的。

你必须像下面那样传递MainWindow 指针来交换。

MainWindow* w1 = new MainWindow1();
MainWindow* w2 = new MainWindow2();
swap(&w1, &w2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2013-03-05
    • 2011-04-06
    相关资源
    最近更新 更多