gpt4 book ai didi

ios - 如何在单个应用程序中混合 Qt 和 native iOS 用户界面元素?

转载 作者:可可西里 更新时间:2023-11-01 05:54:57 25 4
gpt4 key购买 nike

我在 iOS 上使用 Qt 5.2。

我想在单个应用程序中混合使用 QtQuick 1.1 或 QWidgets 与 native iOS 用户界面元素。

将 qml View 嵌入到 UIView 中,必须切换到另一个窗口,将 UIView 嵌入到 qml 组件中,欢迎这方面的任何帮助!

最佳答案

有点晚了,可以在 Qt 宇宙之上显示 native UIView。嵌入 UIView 的技术是让 UIView “漂浮”在层次结构内的 QWidget 上,并在层次结构内小部件的几何形状发生变化时更新 UIView 的几何形状。这样做的局限性:您不能简单地将这样的小部件放在 QTabWidget 中(然后您需要额外的代码来隐藏/显示 UIView)。此外,在包含 UIView 的 QMainWindow 上引发的 QMainWindows 将不起作用。

class View : public QWidget
...
private:
UITextView* m_TextView;
bool m_scheduled;

实现

View::View(QWidget* parent):QWidget(parent),m_Scheduled(false)
{
m_TextView=[[UITextView alloc] init];
QWidget* w= window();
UIView *parentView = reinterpret_cast<UIView *>(w->winId());
[parentView addSubview:m_TextView];
}
View::~View()
{
[m_TextView removeFromSuperview];
m_TextView=nil;
}
bool View::event(QEvent* e)
{
if (e->type()==QEvent::Move || e->type()==QEvent::Resize) {
if (!m_scheduled) {
m_scheduled=true;
QTimer::singleShot( 0, this, SLOT( updateGeo() ) );
}
}
return QWidget::event(e);
}
static inline QRect globalRect(QWidget* widget)
{
return QRect((widget)->mapToGlobal(QPoint(0,0)), (widget)->size());
}
void View::updateGeo()
{
m_scheduled=false;
QRect rg=globalRect(this);
QRect rw=globalRect(window());
CGRect cg=CGRectMake(rg.x(), rg.y()-rw.y(), rg.width(), rg.height());
[m_TextView setFrame:cg];
}

可以找到完整的示例项目here .另一种方法是使用 QML 查看器和 qmlRegisterType 来注册 QQuickItem 后代。

qmlRegisterType<MyTextView>("MyTextView", 1, 0, "MyTextView");

标题

class MyTextView : public QQuickItem
...
private:UITextView* m_view;

在实现中,geometryChanged 方法被覆盖以计算 UIView 坐标中的新矩形

static inline CGRect toCGRect(const QRectF &rect)
{
return CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
}
MyTextView::MyTextView(QQuickItem *parent /*= 0*/)
: QQuickItem(parent)
, m_view(0)
{
connect(this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(onWindowChanged(QQuickWindow*)));
connect(this, SIGNAL(visibleChanged()), this, SLOT(onVisibleChanged()));
}

MyTextView::~MyTextView()
{
[m_view release];
}
void MyTextView::onWindowChanged(QQuickWindow* window)
{
if(!m_view) {
m_view = [[UITextView alloc] init];
}
if (window != 0) {
UIView *parentView = reinterpret_cast<UIView *>(window->winId());
[parentView addSubview:m_view];
} else {
[m_view removeFromSuperView];
}
}
void MyTextView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
{
QQuickItem::geometryChanged(newGeometry, oldGeometry);
CGRect rc = toCGRect(mapRectToScene(newGeometry).toRect());
rc.size.width -= 2;
rc.size.height -= 2;
[m_view setFrame:rc];
}
void MyTextView::onVisibleChanged()
{
[m_view setHidden:isVisible()];
}

在qml文件中

...
import MyTextView 1.0

Window {
visible: true

Column {
anchors.fill: parent
anchors.margins: 5
spacing: 5

Rectangle {
anchors.left: parent.left
anchors.right: parent.right
height: 100
border.width: 1
border.color: "red"
color: "#cccccc"

MyTextView {
anchors.fill: parent
anchors.margins: 1
}
}
}
}

可以找到完整的示例项目here .

关于ios - 如何在单个应用程序中混合 Qt 和 native iOS 用户界面元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com