这里的第一个问题,所以请允许我。
我一直在尝试使用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/