精华内容
下载资源
问答
  • QStackedWidget添加,切换及删除窗口

    千次阅读 2020-07-01 08:25:52
    QStackedWidget可以实现同一界面切换不同的窗口,直接切换就可以显示不同子窗口的内容,可用于创建类似于QTabWidget提供的用户界面。QStackedWidget添加,切换及删除窗口代码示例。

    QStackedWidget添加,切换及删除窗口

         QStackedWidget可以实现同一界面切换不同的窗口,直接切换就可以显示不同子窗口的内容,可用于创建类似于QTabWidget提供的用户界面。

    添加窗口

        QLabel *pFirstPage= new QLabel(this);

        QLabel *pSecondPage = new QLabel(this);

        QLabel *pThirdPage = new QLabel(this);

     

        pFirstPage->setText(QStringLiteral("第一页"));

        pSecondPage->setText(QStringLiteral("第二页"));

        pThirdPage->setText(QStringLiteral("第三页"));

     

         myfrm1 = new Form1(this);

         myfrm2 = new Form2(this);

     

         ui->m_pStackedWidget->addWidget(myfrm1);

         ui->m_pStackedWidget->addWidget(myfrm2);

     

         ui->m_pStackedWidget->addWidget(pFirstPage);

         ui->m_pStackedWidget->addWidget(pSecondPage);

         ui->m_pStackedWidget->addWidget(pThirdPage);

     

    切换方法:

          ui->stackedWidget->setCurrentWidget(pThirdPage);

         ui->m_pStackedWidget->setCurrentWidget(myfrm1);

          ui->stackedWidget->setCurrentIndex(1);

     

    删除所有窗口

        for(int i = ui->m_pStackedWidget->count(); i >= 0; i--)

        {

            QWidget* widget = ui->m_pStackedWidget->widget(i);

            ui->m_pStackedWidget->removeWidget(widget);

            widget->deleteLater();

        }


    备注:实战示例,解疑答惑。

               --不间端地思考,实时地批判你的工作!

    展开全文
  •  在博客Android 源码解析之WindowManager添加窗口 中,先是介绍了如何通过WindowManager添加一个系统窗口,并从源码角度分析了PhoneWindow的创建时机,Window中创建WindowManagerImpl对象,以及创建ViewRootImpl...

    一,写在前面  

            在博客Android 源码解析之WindowManager添加窗口 中,先是介绍了如何通过WindowManager添加一个系统窗口,并从源码角度分析了PhoneWindow的创建时机,Window中创建WindowManagerImpl对象,以及创建ViewRootImpl对象,并调用setView方法完成添加窗口的操作。在ViewRootImpl类内部,通过一次IPC调用(基于Binder机制)和系统服务WindowManagerService进行通信,获取到Session对象。finally,在Session类的内部,将添加窗口的操作交给WindowManagerService处理。

    二,进入主题

           本篇文章是基于窗口的添加基础上进行介绍,强烈建议阅读本篇文章的哥们,先了解WindowManager是如何添加窗口,见 Android 源码解析之WindowManager添加窗口 。因此,直接从WindomManagerImpl开始分析,WindomManagerImpl有这样两个方法都可以删除窗口。
           源码如下:
        @Override
        public void removeView(View view) {
            mGlobal.removeView(view, false);
        }
    
        @Override
        public void removeViewImmediate(View view) {
            mGlobal.removeView(view, true);
        }
           可以看出两个方法都调用了WindomManagerGlobal的removeView方法,只是第二个参数的boolean值不同,调用removeViewImmediate时传入true,调用removeView传入false。
           
           查看WindomManagerGlobal$removeView源码:
        public void removeView(View view, boolean immediate) {
            if (view == null) {
                throw new IllegalArgumentException("view must not be null");
            }
    
            synchronized (mLock) {
                int index = findViewLocked(view, true);
                View curView = mRoots.get(index).getView();
                removeViewLocked(index, immediate);
                if (curView == view) {
                    return;
                }
    
                throw new IllegalStateException("Calling with view " + view
                        + " but the ViewAncestor is attached to " + curView);
            }
        }
           removeView最开始对参数view进行判空检查,为空则抛出异常。为避免多线程同时删除一个View,在同步代码块中处理删除窗口的操作,继续分析代码块中内容。
           其中,WindomManagerGlobal$findViewLocked源码如下:
        private int findViewLocked(View view, boolean required) {
            final int index = mViews.indexOf(view);
            if (required && index < 0) {
                throw new IllegalArgumentException("View=" + view + " not attached to window manager");
            }
            return index;
        }
           在文章 Android 源码解析之WindowManager添加窗口介绍过,mViews是一个存放View的List集合,添加窗口时,会将View添加到mViews中。首先调用list.indexOf获取该View的索引位置,若没有找到该View则抛出异常。在实际开发中,如果该View没有添加到窗口中,那么删除该View会报错。可以在执行删除操作前进行判断,避免抛出异常。也即是说,findViewLocked方法是获取到被删除的View对象在集合中的索引。

           回到WindomManagerGlobal$removeView方法,内部的调用了removeViewLocked方法。
           查看WindomManagerGlobal$removeViewLocked源码:
        private void removeViewLocked(int index, boolean immediate) {
            ViewRootImpl root = mRoots.get(index);
            View view = root.getView();
    
            if (view != null) {
                InputMethodManager imm = InputMethodManager.getInstance();
                if (imm != null) {
                    imm.windowDismissed(mViews.get(index).getWindowToken());
                }
            }
            boolean deferred = root.die(immediate);
            if (view != null) {
                view.assignParent(null);
                if (deferred) {
                    mDyingViews.add(view);
                }
            }
        }
           第2行,通过索引位置index,获取list集合中ViewRootImpl对象。前篇文章中有讲过,在添加窗口的流程中,每添加一次窗口,就会创建一个ViewRootImpl方法,并添加到集合mRoots中。
           第3行,调用ViewRootImpl类的方法,获取被删除的View对象。
           第11行,真正删除窗口的操作是交给ViewRootImpl$die方法。
           ViewRootImpl$die源码如下:
        /**
         * @param immediate True, do now if not in traversal. False, put on queue and do later.
         * @return True, request has been queued. False, request has been completed.
         */
        boolean die(boolean immediate) {
            // Make sure we do execute immediately if we are in the middle of a traversal or the damage
            // done by dispatchDetachedFromWindow will cause havoc on return.
            if (immediate && !mIsInTraversal) {
                doDie();
                return false;
            }
    
            if (!mIsDrawing) {
                destroyHardwareRenderer();
            } else {
                Log.e(mTag, "Attempting to destroy the window while drawing!\n" +
                        "  window=" + this + ", title=" + mWindowAttributes.getTitle());
            }
            mHandler.sendEmptyMessage(MSG_DIE);
            return true;
        }
           第8行,若immediate为true,也就是调用removeViewImmediate删除窗口,直接调用doDie(),并返回false;
           第19行,若immediate为false,也就是调用removeView删除窗口,则使用Handler发送一个消息,并返回true;消息的处理也是调用doDie(),只是多了一步,通过消息机制来处理。
           消息处理源码如下:
        final class ViewRootHandler extends Handler {
    	//...
    
    	@Override
            public void handleMessage(Message msg) {
    	//...
    
    	    case MSG_DIE:
    		doDie();
    		break;
    	
    	//...
    	}
    
    	//...
        
        }

           回到WindomManagerGlobal$removeViewLocked方法,第14行,deferred为true时,也就是调用removeView删除窗口时,将该View对象添加到集合mDyingViews中。注意此时,只是执行了mHandler.sendEmptyMessage(MSG_DIE),发送了一个消息,还并未调用doDie()。因此,mDyingViews存放的是需要删除的View,但仍未真正删除的View。

            通过前面的分析可知:不管使用哪种方式删除窗口,区别在于是否通过消息机制来删除,但最终都是调用了doDie()来处理。
           ViewRootImpl$doDie源码如下:
        void doDie() {
            checkThread();
            if (LOCAL_LOGV) Log.v(mTag, "DIE in " + this + " of " + mSurface);
            synchronized (this) {
                if (mRemoved) {
                    return;
                }
                mRemoved = true;
                if (mAdded) {
                    dispatchDetachedFromWindow();
                }
    
    	//...code
    
                mAdded = false;
            }
            WindowManagerGlobal.getInstance().doRemoveView(this);
        }
           第10行,删除窗口操作放在 dispatchDetachedFromWindow方法中;
           第17行,在完成删除窗口操作后,更新WindowManagerGlobal中维护的四个集合的数据。
           查看WindowManagerGlobal$doRemoveView源码:
        void doRemoveView(ViewRootImpl root) {
            synchronized (mLock) {
                final int index = mRoots.indexOf(root);
                if (index >= 0) {
                    mRoots.remove(index);
                    mParams.remove(index);
                    final View view = mViews.remove(index);
                    mDyingViews.remove(view);
                }
            }
            if (ThreadedRenderer.sTrimForeground && ThreadedRenderer.isAvailable()) {
                doTrimForeground();
            }
        }

           回到ViewRootImpl$doDie方法,内部调用dispatchDetachedFromWindow删除窗口。
           查看ViewRootImpl$dispatchDetachedFromWindow源码如下:
        void dispatchDetachedFromWindow() {
            if (mView != null && mView.mAttachInfo != null) {
                mAttachInfo.mTreeObserver.dispatchOnWindowAttachedChange(false);
                mView.dispatchDetachedFromWindow();
            }
    
            mAccessibilityInteractionConnectionManager.ensureNoConnection();
            mAccessibilityManager.removeAccessibilityStateChangeListener(
                    mAccessibilityInteractionConnectionManager);
            mAccessibilityManager.removeHighTextContrastStateChangeListener(
                    mHighContrastTextManager);
            removeSendWindowContentChangedCallback();
    
            destroyHardwareRenderer();
    
            setAccessibilityFocus(null, null);
    
            mView.assignParent(null);
            mView = null;
            mAttachInfo.mRootView = null;
    
            mSurface.release();
    
            if (mInputQueueCallback != null && mInputQueue != null) {
                mInputQueueCallback.onInputQueueDestroyed(mInputQueue);
                mInputQueue.dispose();
                mInputQueueCallback = null;
                mInputQueue = null;
            }
            if (mInputEventReceiver != null) {
                mInputEventReceiver.dispose();
                mInputEventReceiver = null;
            }
            try {
                mWindowSession.remove(mWindow);
            } catch (RemoteException e) {
            }
    
            // Dispose the input channel after removing the window so the Window Manager
            // doesn't interpret the input channel being closed as an abnormal termination.
            if (mInputChannel != null) {
                mInputChannel.dispose();
                mInputChannel = null;
            }
    
            mDisplayManager.unregisterDisplayListener(mDisplayListener);
    
            unscheduleTraversals();
        }
           首先是做一些垃圾回收的工作,执行View的一些回调方法,注销了一些接口。
           重点注意第35行,内部执行mWindowSession.remove(mWindow)删除窗口,这里的变量mWindowSession就是Session对象。变量mWindowSession的实现类的获取:内部基于Binder机制,与系统服务WindowManagerService进行通信,获取到Session对象。详情可以查看文章 Android 源码解析之WindowManager添加窗口,这里不再阐述。

           查看Session$remove源码如下:
        @Override
        public void remove(IWindow window) {
            mService.removeWindow(this, window);
        }
           mService就是WindowManagerService对象,因此,删除窗口的操作最终是交给WindowManagerService处理了。本篇文章主要介绍WindowManager删除窗口的内部实现原理,分析到这里就结束了。暂不对WindowManagerService删除窗口的具体流程进行介绍,有需要的哥们可以查阅老罗的博客解惑吧~

    三,总结

            值得一提的是,WindowManager删除窗口这种说法,内部其实是删除View。每一个View都需要依赖于Window,View不能独立的存在的去添加,删除,更新。窗口Window是一种抽象的概念,抽取出了一些方法,例如,可以创建以及获取WindowManagerImpl的实例。因此,通过WindowManager增加,删除,更新窗口,内部其实是对View的增加,删除,更新。从WindowManagerImpl方法的命名就可以看出,均跟view相关。

           本篇文章介绍了WindowManager删除窗口的的内部实现原理,WindowManagerImpl有removeView,removeViewImmediate两种方式删除窗口。区别在于removeView通过消息机制,在处理的消息时才调用doDie(),removeViewImmediate则是直接调用doDie()。diDie()内部调用dispatchDetachedFromWindow方法,在dispatchDetachedFromWindow方法中调用Session对象的remove方法,内部是将删除窗口的操作交给WindowManagerService处理。

            另外,在文章 Android 源码解析之WindowManager添加窗口中介绍了窗口得添加,调用了Session对象的addToDisplay方法,内部也是将添加窗口的操作交给WindowManagerService来处理。由此可见,通过WindowManager删除,添加窗口的操作,最终都是交给系统服务WindowManagerService来处理了。可以猜测更新窗口的操作也是这样的,当然确实如此啦~

     











    展开全文
  • new 一个窗口或者控件 QTabWidget addTab 将新建的控件放到一个容器中,比如 QMap<QString , Widget *> m_qmapWidget; QString 部分用来存放 tab的 文本内容,方便后面查找 widget 存放对应的窗口 删除 tab...
    1. new 一个窗口或者控件
    2. QTabWidget addTab
    3. 将新建的控件放到一个容器中,比如 QMap<QString , Widget *> m_qmapWidget;
      QString 部分用来存放 tab的 文本内容,方便后面查找
      widget 存放对应的窗口
    4. 删除 tab通过
      1) removeTab(int index) 删除部分
      2) clear()删除全部

    同理
    QVBoxLayout QHBoxLayout QGridLayout
    添加addWidget 添加相应的窗口 , addLayout 添加容器, addItem 添加容器项
    删除removeWidget 删除控件 removeItem 删除容器

    但是删除的时候需要对删除部分进行 delete 否则会出现控件仍显示的情况

    展开全文
  • MDK5的watch窗口变量删除问题

    千次阅读 2019-02-13 09:47:15
    如图所示:要想删除变量“Touch_Date”,方法一:在仿真前,右键变量Touch_Date然后Remove Watch “Touch_Date”。方法二:stop停止仿真,然后再右键变量Touch_Date然后Remove Watch “Touch_Date”。  在仿真过程...

        如图所示:要想删除变量“Touch_Date”,方法一:在仿真前,右键变量Touch_Date然后Remove Watch “Touch_Date”。方法二:stop停止仿真,然后再右键变量Touch_Date然后Remove Watch “Touch_Date”。

        在仿真过程中,删除不了变量。

    展开全文
  • Qt窗口删除、析构

    千次阅读 2017-04-06 18:36:08
    Qt窗口删除、析构 标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/60/。 Qt内关于窗口删除是一个复杂的事情。接下来详细地讲一讲。 当我们创建一个窗口时,...
  • tmux关闭某个不响应的窗口(window)

    千次阅读 2020-11-05 10:30:31
    在使用tmux过程中,难免会遇到某个窗口不响应或很长时间才响应,怎么办?不能因为某一个窗口而关闭整个session,...2、找到自己的session并删除不响应的窗口: tmux kill-window -t 2 #关闭当前tmux的第2个窗口 ...
  • 1.主窗口添加布局. 都知道在QWidget中,进行布局很简单,直接类似如下即可: QPushButton *firstButton = new QPushButton(); QPushButton *secondButton = new QPushButton(); QPushButton *lastButton = new ...
  • 要从一个布局内删除一个窗口部件,只需调用QLayout::removeWidget()方法。其原型如下:  void QLayout::removeWidget ( QWidget * widget ) 这将删除该布局内的widget窗口部件,但是并没有把它从窗体...
  • Linux杀死Screen窗口

    千次阅读 2019-09-19 19:49:58
    假设已经创建了一个Screen会话:id为001,name为window 1. detach会话 若在会话内,则Ctrl+A+D直接detach会话 若不在会话内,则 screen -d session_id # eg:screen -d 001 ...# eg:screen -X -S 001 qui...
  • screen 窗口常用命令

    千次阅读 2018-06-14 22:34:20
    这篇文章很好,https://blog.csdn.net/hejunqing14/article/details/50338161总结一下:screen -S namescreen python ./a.pyscreen -ls screen -r 2637kill -9 threadnum 例如在...当然就杀死了窗口screen -wipe #...
  • Selenium关闭多余窗口保留当前窗口

    千次阅读 2019-11-19 09:53:41
    from selenium import webdriver d1 = webdriver.Chrome() d1.maximize_window() d1.get(Firsturl) # ... First_handle = d1.current_window_handle ...#切换窗口会第一个窗口 d1.switch_to.window(First_handle)
  • emWin 多窗口切换注意事项

    千次阅读 2020-06-13 16:20:08
    一个是用户不规范的创建和删除窗口,控件或者对话框,另一个是有些控件忘记单独删除,一直在重复的创建,最终导致动态内存不足而死机,比如我们前面章节讲解的绘图控件Graph就是要单独删除的。针对这种情况,最好的...
  • 1 使用 JFrame.validate()函数 2使用 JFrame.pack(); 调整此窗口的大小,以适合其子组件的...如果该窗口和/或其所有者还不可显示,则在计算首选大小之前都将变得可显示。在计算首选大小之后,将会验证该窗口
  • CMD窗口下强制删除文件

    万次阅读 2019-07-13 15:12:06
    为了删除这些顽固文件,我们用cmd窗口进行强制删除。 首先,win+r 打开cmd窗口,输入以下指令 1.强制删除文件:del /F/S/Q 盘符:\文件名 (文件名必须加文件后缀) 2.强制删除文件,不需要任何理由:rd/s/q 盘符:\...
  • 【emWIN】控件使用之后删除

    千次阅读 2018-05-03 15:32:13
    最常用于控件的窗口管理器函数如下所列,其实不限制下面这些函数,很多其它的窗口管理器函数都可以用于控件,窗口管理器函数中的形参 hWin 填控件的句柄即可:例程 描述WM_DeleteWindow() 删除窗口。WM_...
  • linux下如何关闭某个tmux窗口

    千次阅读 2019-01-29 18:26:00
    1.列出当前的tmux窗口 jello@jello:~$ tmux ls 1: 1 windows (createdTue Jan 17 09:28:05 2019) [207x86]13: 1 windows (created Tue Jan 17 17:49:10 2019) [207x86]16: 1 windows (created Thu Jan 17 ...
  • windows窗口销毁

    千次阅读 2015-08-10 19:39:12
    考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(); 2. DestroyWindow会发送WM_DESTROY; 3. WM_DESTROY对应的消息...
  • screen窗口管理器常用操作

    千次阅读 2016-08-17 15:28:17
    screen窗口管理器  screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。   1. 创建新的screen会话 screen [command] [-S name] 2. Detach 会话 screen –d [screen name] 3. ...
  • emWin 2天速成实例教程002_多个页面窗口切换

    万次阅读 多人点赞 2016-11-08 00:03:26
    或者CPU有足够RAM的情况下,建议使用隐藏/显示方式,因为删除/创建方式涉及到动态内存的申请和释放,处理不当或程序不严谨容易出现内存错误造成死机现象,而且删除/创建方式由于切换页面时需要创建窗口,因此切换...
  • SQL Server 2012 外键约束(定义外键、删除外键)

    万次阅读 多人点赞 2019-04-21 20:00:26
    文章目录准备知识定义外键使用SSMS工具定义外键使用SQL方式定义外键删除外键使用SSMS工具删除外键方式一:在对象资源管理器中删除主键方式二:在表设计器中删除主键使用SQL方式删除外键 准备知识     外键...
  • setWindowState(state) #设置窗口状态 Qt.WindowNoState无状态-正常状态 Qt.WindowMinimized 最小化 Qt.WindowMaximized 最大化 self.setWindowState(Qt.WindowMaximized) Qt.WindowFullScreen 全屏 ...
  • Qt如何去掉系统提供的窗口边框

    万次阅读 2017-04-29 09:33:42
    1、直接去掉系统提供的窗口边框,不能移动和改变窗口的大小。 set WindowFlags(Qt::FramelessWindowHint); Qt::FramelessWindowHint: Produces a borderless window. The user cannot move or resize a ...
  • TCP Window Scale 与 接收窗口

    千次阅读 2019-07-10 11:36:20
    TCP刚发明的时候,全世界的网络带宽都很小,所以最大的接受窗口被定义成65535字节,随着硬件的革命性进步,65535已经成为性能瓶颈,而TCP头只给接收窗口值留了16bit,解决方案就是在三次握手时是,把自己的Window ...
  • VC 窗口销毁

    千次阅读 2012-09-04 10:07:03
    基础知识很重要,Win32中的窗口句柄和MFC窗口类对象的2个概念。前者被后者包装了起来。 先看下MSDN中的TN017中的文章 In the case of C++ Windows objects that do perform auto-cleanup, you
  • void CDlgAdvice ::Notify (TNotifyUI & msg) { if (msg . ...关闭窗口并销毁自己 void CDlgAdvice::OnFinalMessage(HWND hWnd) { __super::OnFinalMessage(hWnd); delete this ; }
  • WebForm删除操作弹出确认窗口

    千次阅读 2017-03-25 16:04:53
    删除是比较危险的操作,尤其是硬删除,所以在执行删除操作之前弹出确认对话框让用户确认删除是一种友好的处理方式。
  • QT窗口去掉最大化最小化关闭按钮

    万次阅读 2017-07-15 10:10:48
    在QT界面开发过程中,有的时候需要隐藏最大化最小化甚至是关闭按钮,以排除用户的操作系统无定义,让程序流向混乱现总结如下: 1、Qt的QDialog去掉最大化和最小化以及关闭按钮 :在构造函数中输入this->...
  • PB,pb缓冲区,filter detete之后不更新update,PB-数据窗口缓冲区与数据修改状态
  • MFC窗口销毁过程

    千次阅读 2017-09-13 10:47:51
    考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(); 2. DestroyWindow会发送WM_DESTROY; 3. WM_DESTROY对应的消息...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 596,713
精华内容 238,685
关键字:

删除窗口