c++ - 切换 QDeclarativeView 的源

标签 c++ qt view swap

这是第一个问题,请耐心等待。

我一直在尝试使用 QDeclarativeView 作为 Canvas 在 QMainWindow 上创建一个 View ,但是每当我尝试切换 QDeclarativeView 的源时,我的程序就会出现段错误,坦率地说,我不知道为什么,也不知道如何修复它。

这是我的 swapView() 函数。

void MainWindow::swapView(int view)
{
 switch (view)
 {
    case 0:
        cout << "Switching to Slideshow..." << endl;
        this->setSource("Slideshow.qml");
        break;
    case 1:
        cout << "Switching to Main Canvas..." << endl;
        this->setSource("Test.qml");
        cout << "Successfully switched to Main Canvas!" << endl;
        break;
 }
}

这是它调用的 setSource() 方法:

void MainWindow::setSource(QString fileName)
{
    this->ui->declarativeView->setSource(QUrl::fromLocalFile("Test.qml"));
}

我尝试用下面的代码替换上面的代码,它消除了段错误,但是每个窗口都在单独的窗口中打开,而不是仅仅替换 QDeclarativeView 上的 View 。

void MainWindow::setSource(QString fileName)
{
    QDeclarativeView *view = new QDeclarativeView;
    view->setSource(QUrl::fromLocalFile(fileName));
    ui->declarativeView = view;
    ui->declarativeView->show();
}

如果有人对我做错的事情有任何意见(我确信这是愚蠢的事情),请告诉我......

谢谢。

最佳答案

看起来这次崩溃是由于该对象方法内旧文档管理的 C++ 对象被破坏引起的。就我而言,我有 MuseArea,它会触发我的 C++ 代码中的一个槽,用于切换源文档。 像这样的崩溃:

QML代码:

MouseArea {
    anchors.fill: parent
    onClicked: cppObject.action()
}

C++代码

QDeclarativeView * viewInstance();

class CppObject: public QObject {
Q_OBJECT
public slots:
     void action() { viewInstance()->setSource("another.qml") }
};

解决这个问题的方法是在 QML 事件调用的代码和 setSource 调用之间的某个位置使用排队连接。 以下代码运行良好:

QML代码:

MouseArea {
    anchors.fill: parent
    onClicked: cppObject.actionNeeded()
}

C++代码

QDeclarativeView * viewInstance();

class CppObject: public QObject {
Q_OBJECT
public:
     explicit CppObject(QObject *parent = 0) : QObject(parent)
     {
         connect(
             this,SIGNAL(actionNeeded()),
             this,SLOT(action()),
             Qt::QueuedConnection
         );
     }
public slots:
     void action() { viewInstance()->setSource("another.qml") }
signals:
     void actionNeeded();
};

关于c++ - 切换 QDeclarativeView 的源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492277/

相关文章:

qt - 如何禁用 QTreeWidget/QTreeView 中的扩展?

c++ - 有人建议我这段代码中剩下的内容。运行时未显示任何错误,但输出带有垃圾值

c++ - 在C中使用括号进行计算

c++ - 如何继承类型列表,然后调用继承成员列表中的成员?

qt - 如何配置 qmake 以便我的应用程序安装为 "make install"?

qt - 在 qt 应用程序中使用 closeEvent 不会关闭它

ios - 来自 .xib 的表头 View

FireMonkey 的 HTML 查看器

c# - 选择 Word 互操作标题范围会导致 Word 切换到草稿 View

c++ - 为什么这个 'if' 语句循环?