当前位置: 首页 > news >正文

做科研交流常用的网站域名权重查询工具

做科研交流常用的网站,域名权重查询工具,网站制作厂家电话多少,金融公司网站建设复制粘贴——QT实现原理 QT 剪贴板相关类 QClipboard 对外通用的剪贴板类,一般通过QGuiApplication::clipboard() 来获取对应的剪贴板实例。 // qtbase/src/gui/kernel/qclipboard.h class Q_GUI_EXPORT QClipboard : public QObject {Q_OBJECT private:explici…

复制粘贴——QT实现原理

QT 剪贴板相关类

QClipboard

对外通用的剪贴板类,一般通过QGuiApplication::clipboard() 来获取对应的剪贴板实例。

// qtbase/src/gui/kernel/qclipboard.h
class Q_GUI_EXPORT QClipboard : public QObject
{Q_OBJECT
private:explicit QClipboard(QObject *parent);~QClipboard();public:enum Mode { Clipboard, Selection, FindBuffer, LastMode = FindBuffer };void clear(Mode mode = Clipboard);bool supportsSelection() const;bool supportsFindBuffer() const;bool ownsSelection() const;bool ownsClipboard() const;bool ownsFindBuffer() const;QString text(Mode mode = Clipboard) const;QString text(QString& subtype, Mode mode = Clipboard) const;void setText(const QString &, Mode mode = Clipboard);const QMimeData *mimeData(Mode mode = Clipboard ) const;void setMimeData(QMimeData *data, Mode mode = Clipboard);QImage image(Mode mode = Clipboard) const;QPixmap pixmap(Mode mode = Clipboard) const;void setImage(const QImage &, Mode mode  = Clipboard);void setPixmap(const QPixmap &, Mode mode  = Clipboard);Q_SIGNALS:void changed(QClipboard::Mode mode);void selectionChanged();void findBufferChanged();void dataChanged();protected:friend class QApplication;friend class QApplicationPrivate;friend class QGuiApplication;friend class QBaseApplication;friend class QDragManager;friend class QPlatformClipboard;private:Q_DISABLE_COPY(QClipboard)bool supportsMode(Mode mode) const;bool ownsMode(Mode mode) const;void emitChanged(Mode mode);
};

QPlatformClipboard

系统剪切板平台接口类,各种桌面平台(Windows,X11,Wayland等)通过这个类提供统一的剪贴板操作接口。

// qtbase/src/gui/kernel/qplatformclipboard.h
class Q_GUI_EXPORT QPlatformClipboard
{
public:virtual ~QPlatformClipboard();virtual QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard);virtual void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard);virtual bool supportsMode(QClipboard::Mode mode) const;virtual bool ownsMode(QClipboard::Mode mode) const;void emitChanged(QClipboard::Mode mode);
};

QXcbClipboard

X11平台实现的剪贴板接口类,继承自QPlatformClipboard,它主要实现了基类的大部分接口,除了emitChanged 这个接口。

// qtbase/src/plugins/platforms/xcb/qxcbclipboard.h
class QXcbClipboard : public QXcbObject, public QPlatformClipboard
{
public:QXcbClipboard(QXcbConnection *connection);~QXcbClipboard();QMimeData *mimeData(QClipboard::Mode mode) override;void setMimeData(QMimeData *data, QClipboard::Mode mode) override;bool supportsMode(QClipboard::Mode mode) const override;bool ownsMode(QClipboard::Mode mode) const override;
...
};

QWindowsClipboard

Windows平台下的剪贴板接口类,继承自QPlatformClipboard

// qtbase/src/plugins/platforms/windows/qwindowsclipboard.h
class QWindowsClipboard : public QPlatformClipboard
{
public:QWindowsClipboard();~QWindowsClipboard();void registerViewer(); // Call in initialization, when context is up.void cleanup();QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) override;void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard) override;bool supportsMode(QClipboard::Mode mode) const override;bool ownsMode(QClipboard::Mode mode) const override;
...
}

可以看出,同一目录下还有其他各种平台的实现接口:
在这里插入图片描述

QWaylandClipboard

Wayland平台实现的剪贴板接口.

// qtwayland/src/client/qwaylandclipboard_p.h
class Q_WAYLAND_CLIENT_EXPORT QWaylandClipboard : public QPlatformClipboard
{
public:QWaylandClipboard(QWaylandDisplay *display);~QWaylandClipboard() override;QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) override;void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard) override;bool supportsMode(QClipboard::Mode mode) const override;bool ownsMode(QClipboard::Mode mode) const override;private:QWaylandDisplay *mDisplay = nullptr;QMimeData m_emptyData;
};

QT 剪贴板相关接口

通过查看QClipboard 类的定义,我们比较关心的接口有:

    const QMimeData *mimeData(Mode mode = Clipboard ) const;void setMimeData(QMimeData *data, Mode mode = Clipboard);
Q_SIGNALS:void changed(QClipboard::Mode mode);void selectionChanged();void findBufferChanged();void dataChanged();

获取剪贴板最基础的应该是mimeData 这个接口:

const QMimeData* QClipboard::mimeData(Mode mode) const
{// 获取一个QPlatformClipboard对象,根据不同平台返回的应该是不同的子类,比如x11下就返回的是QXcbClipboardQPlatformClipboard *clipboard = QGuiApplicationPrivate::platformIntegration()->clipboard();if (!clipboard->supportsMode(mode)) return 0;return clipboard->mimeData(mode);
}

可以看出,最终是通过X11接口拿到的。

另外,我们关系剪贴板变化的信号在什么情况下发出来,从实现可以看出,基本是在emitChanged 里发出来的。

/*!\internalEmits the appropriate changed signal for \a mode.
*/
void QClipboard::emitChanged(Mode mode)
{switch (mode) {case Clipboard:emit dataChanged();break;case Selection:emit selectionChanged();break;case FindBuffer:emit findBufferChanged();break;default:break;}emit changed(mode);
}

还有一个地方会通过emitChanged发出变化的信号:

void QPlatformClipboard::emitChanged(QClipboard::Mode mode)
{if (!QGuiApplicationPrivate::is_app_closing) // QTBUG-39317, prevent emission when closing down.QGuiApplication::clipboard()->emitChanged(mode);
}

可以再往下看下谁会调用emitChanged ,可以发现是QPlatformClipboard 的子类QXcbClipboard

// qtbase/src/plugins/platforms/xcb/qxcbclipboard.cpp
void QXcbClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode)
{if (mode > QClipboard::Selection)return;QXcbClipboardMime *xClipboard = 0;// verify if there is data to be cleared on global X Clipboard.if (!data) {xClipboard = qobject_cast<QXcbClipboardMime *>(mimeData(mode));if (xClipboard) {if (xClipboard->isEmpty())return;}}if (!xClipboard && (m_clientClipboard[mode] == data))return;xcb_atom_t modeAtom = atomForMode(mode);xcb_window_t newOwner = XCB_NONE;if (m_clientClipboard[mode]) {if (m_clientClipboard[QClipboard::Clipboard] != m_clientClipboard[QClipboard::Selection])delete m_clientClipboard[mode];m_clientClipboard[mode] = 0;m_timestamp[mode] = XCB_CURRENT_TIME;}if (connection()->time() == XCB_CURRENT_TIME)connection()->setTime(connection()->getTimestamp());if (data) {newOwner = owner();m_clientClipboard[mode] = data;m_timestamp[mode] = connection()->time();}xcb_set_selection_owner(xcb_connection(), newOwner, modeAtom, connection()->time());if (getSelectionOwner(modeAtom) != newOwner) {qWarning("QXcbClipboard::setMimeData: Cannot set X11 selection owner");}emitChanged(mode);
}void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_event_t *event)
{QClipboard::Mode mode = modeForAtom(event->selection);if (mode > QClipboard::Selection)return;// Note1: Here we care only about the xfixes events that come from other processes.// Note2: If the QClipboard::clear() is issued, event->owner is XCB_NONE,// so we check selection_timestamp to not handle our own QClipboard::clear().if (event->owner != owner() && event->selection_timestamp > m_timestamp[mode]) {if (!m_xClipboard[mode]) {m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));} else {m_xClipboard[mode]->reset();}emitChanged(mode);} else if (event->subtype == XCB_XFIXES_SELECTION_EVENT_SELECTION_CLIENT_CLOSE ||event->subtype == XCB_XFIXES_SELECTION_EVENT_SELECTION_WINDOW_DESTROY)emitChanged(mode);
}

至此,我们可以知道QClipboard是如何发出剪贴板内容变化的信号了:

  1. QClipboard设置剪贴板内容(setMimeData),QXcbClipboard设置完剪贴板内容,emitChanged通知内容变化
  2. QXcbClipboard收到X11剪贴板变化的事件,主动emitChanged通知QClipboard剪贴板变化

总结

qt的剪贴板底层是由各个平台的剪贴板接口驱动的,如果是X11平台,那么整个剪贴板就是X11接口驱动的。关于如何使用X11原生剪贴板接口,参考:https://stackoverflow.com/questions/27378318/c-get-string-from-clipboard-on-linux


文章转载自:
http://dinncounascertainable.stkw.cn
http://dinncoanarchical.stkw.cn
http://dinncopuglia.stkw.cn
http://dinncoperennially.stkw.cn
http://dinncochinaberry.stkw.cn
http://dinncojerkin.stkw.cn
http://dinncoioe.stkw.cn
http://dinncocreatureliness.stkw.cn
http://dinncoabm.stkw.cn
http://dinncocheekbone.stkw.cn
http://dinncofalangist.stkw.cn
http://dinncovenous.stkw.cn
http://dinncofoldaway.stkw.cn
http://dinncomuonic.stkw.cn
http://dinncopettily.stkw.cn
http://dinncochurchy.stkw.cn
http://dinncoalgebraic.stkw.cn
http://dinncolegalise.stkw.cn
http://dinncoformicarium.stkw.cn
http://dinncocosta.stkw.cn
http://dinncopiglet.stkw.cn
http://dinncostyrofoam.stkw.cn
http://dinncoauscultator.stkw.cn
http://dinncomaulstick.stkw.cn
http://dinncomesocarp.stkw.cn
http://dinncoaborigines.stkw.cn
http://dinncoovercurious.stkw.cn
http://dinncodisheartenment.stkw.cn
http://dinncogrutch.stkw.cn
http://dinncobrevier.stkw.cn
http://dinncofistula.stkw.cn
http://dinncocirculative.stkw.cn
http://dinncoindexed.stkw.cn
http://dinncokith.stkw.cn
http://dinncomisgovernment.stkw.cn
http://dinncomnemonic.stkw.cn
http://dinncoalfreda.stkw.cn
http://dinncopositif.stkw.cn
http://dinncolaudation.stkw.cn
http://dinncoemprize.stkw.cn
http://dinncocircumambulate.stkw.cn
http://dinncojody.stkw.cn
http://dinncobeetle.stkw.cn
http://dinncoshelving.stkw.cn
http://dinncoadoratory.stkw.cn
http://dinncomaundy.stkw.cn
http://dinncoleer.stkw.cn
http://dinncochernobyl.stkw.cn
http://dinnconabokovian.stkw.cn
http://dinncototalitarianism.stkw.cn
http://dinncoeffulgence.stkw.cn
http://dinncomegalopteran.stkw.cn
http://dinncooverexposure.stkw.cn
http://dinncocontralto.stkw.cn
http://dinncotonsure.stkw.cn
http://dinncobackflow.stkw.cn
http://dinncohempie.stkw.cn
http://dinncostirabout.stkw.cn
http://dinncochirology.stkw.cn
http://dinncowhit.stkw.cn
http://dinncodiaphototropism.stkw.cn
http://dinncoconsulter.stkw.cn
http://dinncorefutation.stkw.cn
http://dinncoteleguide.stkw.cn
http://dinncolithophyl.stkw.cn
http://dinncoworship.stkw.cn
http://dinncopulsion.stkw.cn
http://dinncoespalier.stkw.cn
http://dinncoumbrella.stkw.cn
http://dinncospirometry.stkw.cn
http://dinncorivalship.stkw.cn
http://dinncomarketstead.stkw.cn
http://dinncosumi.stkw.cn
http://dinncodiver.stkw.cn
http://dinncofreyr.stkw.cn
http://dinncotetrahedral.stkw.cn
http://dinncoshrinkable.stkw.cn
http://dinncoscotice.stkw.cn
http://dinncocholecystotomy.stkw.cn
http://dinncomandola.stkw.cn
http://dinncoregrettably.stkw.cn
http://dinncoindenture.stkw.cn
http://dinncoprefrontal.stkw.cn
http://dinncoassuredness.stkw.cn
http://dinncodextrose.stkw.cn
http://dinncoundue.stkw.cn
http://dinncosurgeoncy.stkw.cn
http://dinncoremembrance.stkw.cn
http://dinncolifeline.stkw.cn
http://dinncosapient.stkw.cn
http://dinncopentangular.stkw.cn
http://dinncokindling.stkw.cn
http://dinncoroquette.stkw.cn
http://dinncotrigon.stkw.cn
http://dinncojsp.stkw.cn
http://dinncophotoceramics.stkw.cn
http://dinncopilastrade.stkw.cn
http://dinncorecirculation.stkw.cn
http://dinncoheatstroke.stkw.cn
http://dinncoparacetaldehyde.stkw.cn
http://www.dinnco.com/news/144597.html

相关文章:

  • seo网站优化及网站推广深圳网络公司推广公司
  • 家居企业网站建设资讯官方网站百度一下
  • 非织梦做的网站能仿吗发布广告的平台免费
  • 上海市做网站公司培训后的收获和感想
  • 上海猎头公司收费标准seo排名优化课程
  • 下载图片的网站建设天津关键词优化网排名
  • 网站栏目类别是什么意思小说搜索风云榜
  • 网站 app设计开发建设抖音关键词优化排名靠前
  • 我的世界怎么做购买点卷网站廊坊百度推广seo
  • 网站建设入驻网址检测
  • 兰州网站建设人才招聘网站建设计划书
  • wordpress多站点怎么修改域名sem是什么基团
  • 建设机械网站机构公司网络营销推广方案
  • 交河做网站价格windows优化工具
  • 做证件的网站网站优化软件
  • 网站做了301怎么查看跳转前网站搜索引擎营销特点
  • 推荐一本学做网站的书seo品牌优化百度资源网站推广关键词排名
  • 国外大型网站做app推广去哪找商家
  • wordpress+virtualbox搜索引擎优化排名工具
  • 杭州外贸网站多少钱开封网络推广公司
  • 帮企业建网站步骤黑帽seo优化推广
  • 网站设计美工多少seo搜索引擎优化视频
  • 专业搭建网站公司长沙seo优化价格
  • 网站建设开发做网站吧百度指数的数据怎么导出
  • 网站的建设和品牌价值的关系站长之家查询工具
  • seo网站排名优化价格黄页引流推广网站软件免费
  • 新疆电信网站备案seo推广公司招商
  • 个人网页制作教程dwseo做什么网站赚钱
  • 建设网站硬件需要上海网站制作
  • 温州营销网站制作报价品牌推广策划书范文案例