精华内容
下载资源
问答
  • 对话框的组成菜单栏
    千次阅读
    2017-04-19 15:44:34
        对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。尽管 Ribbon 界面的出现在一定程度上减少了对话框的使用几率,但是,我们依然可以在最新版本的 Office 中发现不少对话框。因此,在可预见的未来,对话框会一直存在于我们的程序之中。

        Qt 中使用 QDialog 类实现对话框。就像主窗口一样,我们通常会设计一个类继承 QDialog。QDialog(及其子类,以及所有 Qt::Dialog 类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

        对话框分为模态对话框和非模态对话框。所谓模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。

        Qt 支持模态对话框和非模态对话框。其中, Qt 有两种级别的模态对话框:应用程序级别的模态和窗口级别的模态,默认是应用程序级别的模态。应用程序级别的模态是指,当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。窗口级别的模态是指,该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式
        Qt 使用 QDialog::exec()实现应用程序级别的模态对话框,使用 QDialog::open()实现窗口级别的模态对话框,使用 QDialog::show()实现非模态对话框。回顾一下我们的代码,在上面的示例中,我们调用了 exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。
    #include "mainwindow.h"
    #include <QAction>//动作
    #include <QMenuBar>//菜单栏
    #include <QMessageBox>//消息提示框
    #include <QToolBar>//工具栏
    
    #include <QStatusBar>//状态栏
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        this->setWindowTitle("呵呵");
        this->setMinimumSize(300,300);
        /*
         * 在 QAction 构造函数,我们传入了一个图标、一个文本和 this 指针。
         * 图标我们使用了 QIcon,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。
         * 以 : 开始,意味着从资源文件中查找资源。
         * QAction 第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。
         * 下面一句,我们使用了 setShortcut() 函数,用于说明这个 QAction 的快捷键。 Qt 的
         * QKeySequence 为我们定义了很多内置的快捷键,比如我们使用的 Open。
         * setStatusTip() 则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。
         *后面的 connect() 函数, 将这个 QAction 的 triggered() 信号与 MainWindow 类的
         * open() 函数连接起来。当用户点击了这个 QAction 时,会自动触发 MainWindow 的 open() 函数。
        */
        openaction=new QAction(QIcon(":/new/prefix1/myico"),tr("&打开文件"),this);
        openaction->setShortcuts(QKeySequence::Open);
        openaction->setStatusTip(tr("open an existing file"));
        connect(openaction,&QAction::triggered,this,&MainWindow::open);
        /*
         *下面的 maneBar()、 toolBar() 和 statusBar() 三个是 QMainWindow 的函数,用于创建并返回
         * 菜单栏、工具栏和状态栏。我们可以从代码清楚地看出,我们向菜单栏添加了一个 File 菜单,
         * 并且把这个 QAction 对象添加到这个菜单;同时新增加了一个 File 工具栏,也把 QAction 对
         * 象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变
         * 成了一个按钮。至于状态栏,则是出现在窗口最下方,用于显示动作对象的提示信息的
        */
        /*
         * menuBar() 是 QMainWindow提供的函数,因此你是不会在 QWidget 或者 QDialog 中找到它的。
         * 这个函数会返回窗口的菜单栏, 如果没有菜单栏则会新创建一个。QMenuBar 代表的是窗口
         * 最上方的一条菜单栏。我们使用其 addMenu() 函数为其添加菜单。
         * QToolBar 就是工具栏。我们使用的是 addToolBar()函数添加新的工具栏。
         * 为什么前面一个是 menuBar() 而现在的是 addToolBar() 呢?因为一个窗口只有一个菜单栏,
         * 但是却可能有多个工具栏。
        */
        QMenu *file=menuBar()->addMenu(tr("&文件"));
        file->addAction(openaction);
        QMenu *file2=menuBar()->addMenu(tr("&主页"));
        file2->addAction(openaction);
        QToolBar *toolbar=addToolBar(tr("&File"));
        toolbar->addAction(openaction);
        QStatusBar *statusbar=statusBar();
        statusbar->addAction(openaction);
    }
    
    void MainWindow::open(){
        QDialog dlg;
        dlg.setWindowTitle("嘿嘿");
        /*
         * Qt 使用 QDialog::exec() 实现应用程序级别的模态对话框,使用 QDialog::open() 实现窗口级别的
         * 模态对话框,使用 QDialog::show() 实现非模态对话框。
        */
        dlg.exec();
    }
    /*
     * 非模态对话框,在堆上建立
     * setAttribute() 函数设置对话框关闭时,自动销毁对话框。
     * void MainWindow::open()
     * {
     * QDialog *dialog = new QDialog;
     * dialog->setAttribute(Qt::WA_DeleteOnClose); // 或者 dialog->deleteLater();
     * dialog->setWindowTitle(tr("Hello, dialog!"));
     * dialog->show();
     * }
    */
    MainWindow::~MainWindow()
    {
    }



    更多相关内容
  • MFC 对话框 添加 工具

    千次阅读 2021-10-15 12:48:56
    MFC 对话框 添加 工具 MFC中如何删除工具中多余的图标 刚学习MFC的时候,发现在MFC资源视图里面编辑工具的时候,多余的图标没有删除键,其实只要把你要删除的图标按住并往外拖就可以了。 ...

    MFC 对话框 添加 工具栏

    Toolbar

    在这里插入图片描述

    MFC中如何删除工具栏中多余的图标

    刚学习MFC的时候,发现在MFC资源视图里面编辑工具栏的时候,多余的图标没有删除键,其实只要把你要删除的图标按住并往外拖就可以了。

    在这里插入图片描述
    工具栏资源的最右边总是会有一个待编辑的按钮,我们对其进行编辑后,工具栏资源会自动增加一个新的空白按钮,这也实现了按钮的添加操作。如果我们想要删除某个按钮,就可以用鼠标左键点住它,拖出工具栏资源的范围即可。

       另外,我们看到,第三个按钮(保存按钮)和第四个按钮(剪切按钮)之间有一些间隙,在运行程序后会出现一个竖的分隔线,所以想要在两个按钮之间添加分隔线的话,可以用鼠标左键拖住右边的按钮往右稍移动一些就可以了。
    
    删除分割线

    可以用鼠标左键拖住右边的按钮往左移动到快覆盖左边的按钮的时候松开就可以了。
    在这里插入图片描述
    如果 按钮 之间 有分割线 ,分割线 也会占用一个index 序号, 就是 本来 0123456 现在是01234567

    通过Toolbar 添加 ID

    如果 事件处理函数 已经定义了,建立关联 需要手动添加关联
    如果 事件处理函数 没有定义,建立关联 可以通过类向导

    在这里插入图片描述
    这个图中代码 有点问题.

    在这里插入图片描述
    VC 自动生成的ID 不一定正好是按照顺序的
    看下面的例子

     atlTraceGeneral - m_Toolbar 0 -- 32811
     atlTraceGeneral - m_Toolbar 1 -- 32810
     atlTraceGeneral - m_Toolbar 2 -- 32812
     atlTraceGeneral - m_Toolbar 3 -- 32813
     atlTraceGeneral - m_Toolbar 4 -- 32814
     atlTraceGeneral - m_Toolbar 5 -- 32815
     atlTraceGeneral - m_Toolbar 6 -- 32816
    

    Resource.h VC 自动生成的,每次重新编译 都会自动生成
    在这里插入图片描述

    广州大学MFC实验报告——学生成绩管理系统

    https://blog.csdn.net/weixin_43999137/article/details/91184179

    https://github.com/wujiekd/MFC-student-performance-management-system

    VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)

    https://blog.csdn.net/zhaoyinhui0802/article/details/53471257

    上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏。

       工具栏简介
    
       工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成。当用户用鼠标单击工具栏上某个按钮时,程序会执行相应的操作,如果鼠标没有点击,只是停留在某个按钮上一会后,会弹出一个小窗口显示提示信息。
    
       一般工具栏中的按钮在菜单栏中都有对应的菜单项中,即点击工具栏按钮与点击菜单项的效果相同。但工具栏中的按钮都显式的排列出来,操作很方便,而且按钮上的图片描述功能更直观,所以工具栏作为用户操作接口来说比菜单更加便捷。
    
       VS2013工具栏资源详解
    
       本节仍然以VS2013/MFC编程入门之三十二(菜单:VS2010菜单资源详解)中创建的单文档工程Example32为基础,讲解工具栏资源。
    
       在Example32工程中,打开资源视图,展开Example32->Example32.rc->Toolbar,我们可以看到有一个ID为IDR_MAINFRAME的工具栏资源,双击打开,工具栏资源显示如下:
    

    在这里插入图片描述
    以IDR_MAINFRAME工具栏的第一个按钮为例说明工具栏按钮的各项属性。用鼠标单击工具栏资源上的第一个按钮,属性页中就会显示其属性。下面分别讲解各项属性。

       ID属性:ID_FILE_NEW。将菜单Meun的时候我们讲过,菜单IDR_MAINFRAME的菜单项文件->新建的ID也是ID_FILE_NEW,两者ID相同,正是如此才使得工具栏第一个按钮与菜单项文件->新建能实现相同的功能。所以如果想让工具栏某个按钮与菜单栏某个菜单项点击后执行的操作相同,就要为两者设置相同的ID。
    
       Prompt属性:创建新文档\n新建。此属性为工具栏按钮的提示文本。在鼠标指向此按钮时,状态栏中会显示“创建新文档”,当弹出提示信息窗口时会显示包含“新建”的提示信息。“\n”是两者的分隔转义符。
    
       Height属性:15。此属性为工具栏按钮的像素高度。
    
       Width属性:16。此属性为工具栏按钮的像素宽度。
    
       工具栏资源的最右边总是会有一个待编辑的按钮,我们对其进行编辑后,工具栏资源会自动增加一个新的空白按钮,这也实现了按钮的添加操作。如果我们想要删除某个按钮,就可以用鼠标左键点住它,拖出工具栏资源的范围即可。
    
       另外,我们看到,第三个按钮(保存按钮)和第四个按钮(剪切按钮)之间有一些间隙,在运行程序后会出现一个竖的分隔线,所以想要在两个按钮之间添加分隔线的话,可以用鼠标左键拖住右边的按钮往右稍移动一些就可以了。
    
       CToolBar类的主要成员函数
    
       MFC为工具栏的操作提供了CToolBar类。下面介绍CToolBar类的主要成员函数。
    
       virtual BOOL CreateEx(
                 CWnd* pParentWnd,
                 DWORD dwCtrlStyle = TBSTYLE_FLAT,
                 DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
                 CRect rcBorders = CRect(0, 0, 0, 0),
                 UINT nID = AFX_IDW_TOOLBAR
        );
    
       创建工具栏对象。参数pParentWnd为工具栏父窗口的指针。参数dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。参数dwStyle为工具栏的风格,默认取值WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部, 各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。参数rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。参数nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。
    
       BOOL LoadBitmap(UINT nIDResource);
    
       为工具栏加载位图。参数nIDResource为位图资源的ID。成功则返回TRUE,否则返回FALSE。注意,这里的位图资源应当为每个工具栏按钮都提供位图,如果图片不是标准大小(16像素宽,15像素高),则需要调用SetSizes成员函数调整按钮大小和图片大小。
    
       BOOL LoadToolBar(UINT nIDResource);
    
       加载由nIDResource指定的工具栏。参数nIDResource为要加载的工具栏的资源ID。成功则返回TRUE,否则返回FALSE。
    
       void SetSizes(SIZE sizeButton,SIZE sizeImage);
    
       设置工具栏按钮的大小和图片的大小。参数sizeButton为工具栏按钮的像素大小。参数sizeImage为图片的像素大小。
    
       void SetButtonStyle(int nIndex,UINT nStyle);
    
       设置工具栏按钮或分隔线的风格,或者为按钮分组。参数nIndex为将要进行设置的按钮或分隔线的索引。参数nStyle为按钮风格,可以是以下取值:
    
       TBBS_BUTTON   标准按钮(默认)
       TBBS_SEPARATOR   分隔条 
       TBBS_CHECKBOX   复选框 
       TBBS_GROUP   标记一组按钮的开始
       TBBS_CHECKGROUP   标记一组复选框的开始
       TBBS_DROPDOWN   创建下拉列表按钮
       TBBS_AUTOSIZE   按钮的宽度根据按钮文本计算,而不基于图片大小 
       TBBS_NOPREFIX   按钮的文本没有快捷键前缀
    
       UINT GetButtonStyle(int nIndex) const;
    
       获取工具栏按钮或分隔条的风格。风格可参考SetButtonStyle。参数nIndex为按钮或分隔条的索引。
    
       BOOL SetButtonText(int nIndex,LPCTSTR lpszText);
    
       设置工具栏按钮的文本。参数nIndex为工具栏按钮的索引。参数lpszText为指向要设置的文本字符串的指针。设置成功则返回TRUE,否则返回FALSE。
    
       CString GetButtonText(int nIndex) const;
    
       获取工具栏按钮上显示的文本。参数nIndex为工具栏按钮的索引。
    

    工具栏的使用

       一般情况下工具栏中的按钮在菜单栏中都有对应的菜单项,两者实现的功能相同,要想实现这种效果,只需要将工具栏按钮的ID与对应的菜单栏中菜单项的ID设置为相同值即可。
    
       在实际使用工具栏时,除了前面讲的资源编辑外,其他使用与菜单类似。例如,对COMMAND消息和UPDATE_COMMAND_UI消息,可以像VS2013/MFC编程入门之三十三(菜单:菜单及CMenu类的使用)中的菜单应用实例那样为工具栏按钮添加消息处理函数。
    
       如果工具栏按钮对应的菜单项已经添加了消息处理函数,那么就不必再为它添加了,因为它的ID与菜单项相同,所以会调用同样的消息处理函数。这样点击工具栏按钮与点击相应菜单项执行相同的功能,在菜单项为选中、激活或禁用等状态时,工具栏按钮会有一样的状态。
    
       工具栏的创建
    
       大家在第三十二讲创建的Example32工程的CMainFrame类中看到,它创建工具栏所使用的类并不是常用的CToolBar类,而是CMFCToolBar类。CMFCToolBar类是自VS2008以来MFC提供的类,它与CToolBar类有些类似,但功能更丰富。这里要注意,CMFCToolBar类与CToolBar类并没有任何派生关系。
    
       本教程就以CMFCToolBar类来讲讲工具栏的创建步骤:
    
       1. 创建工具栏资源。
    
       2. 构造CMFCToolBar类的对象。
    
       3. 调用CMFCToolBar类的Create或CreateEx成员函数创建工具栏。
    
       4. 调用LoadToolBar成员函数加载工具栏资源。
    
       大家可以对应着看看Example32的CMainFrame类自动生成的代码中创建工具栏的过程。
    
       工具栏IDR_MAINFRAME的资源已经自动创建好。在MainFrm.h文件对CMainFrame类的声明中,定义了CMFCToolBar类的对象作为成员对象:CMFCToolBar  m_wndToolBar;。然后在CMainFrame::OnCreate函数的实现中可以看到工具栏的创建以及加载工具栏资源的代码,如下:
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
    {   
        if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
            return -1;   
             ......if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
    {
    TRACE0("未能创建工具栏\n");
    return -1;      // 未能创建
    }
        ......return 0;   
    }  
    
    

    因为创建框架窗口时需要调OnCreate函数,所以工具栏的创建也是在OnCreate中完成的。

       工具栏的停靠
    
       在创建好工具栏后,如果想要停靠工具栏,也需要添加相应的停靠代码。工具栏停靠的步骤及需要调用的函数如下(前两个步骤可以颠倒顺序):
    
       1. 在框架窗口中启用停靠。
    
           若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。可以在CFrameWndEx类中调用下面的成员函数来实现:
    
           BOOL EnableDocking(DWORD dwDockStyle);
    
           该函数采用一个DWORD参数,用来指定框架窗口的哪个边可以接受停靠,可以有四种取值:CBRS_ALIGN_TOP(顶部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左侧)、CBRS_ALIGN_RIGHT(右侧)。如果希望能够将控制条停靠在任意位置,将CBRS_ALIGN_ANY作为参数传递给EnableDocking。
    
       2. 工具栏启用停靠。
    
           框架窗口启用停靠准备好后,必须以相似的方式准备工具栏。为想要停靠的每一个工具栏CMFCToolBar对象调用下面的函数:
    
           virtual void EnableDocking(DWORD dwAlignment);
    
           允许工具栏停靠到框架窗口,并指定工具栏应停靠的目标边。此函数指定的目标边必须与框架窗口中启用停靠的边匹配,否则工具栏无法停靠,为浮动状态。
    
       3. 停靠工具栏。
    
           当用户试图将工具栏放置在允许停靠的框架窗口某一边时,需要框架CFrameWndEx类调用以下函数:
    
           void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);
    
           参数pBar为要停靠的控制条的指针,参数nDockBarID为要停靠的框架窗口某条边的ID,可以是以下四种取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。
    
        下面我们接着看Example32的CMainFrame类的OnCreate函数实现中,工具栏的停靠过程:
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
    {   
        if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
            return -1;   
      
        ......// 调用CreateEx函数创建工具栏,并调用LoadToolBar函数加载工具栏资源  
        if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||   
            !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))   
        {   
            TRACE0("Failed to create toolbar\n");   
            return -1;      // fail to create   
        }     
             ......// TODO:  如果您不希望工具栏和菜单栏可停靠,请删除这五行
    m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndMenuBar);
    DockPane(&m_wndToolBar);
             ......return 0;   
    }  
    
    

    关于工具栏的知识就讲到这里了,最近由于要准备期末考试,每天更新的内容比较少,希望大家谅解,谢谢。。感谢大家长期以来的支持。

    工具栏 例子 代码 vs2017

    https://download.csdn.net/download/wowocpp/33353202
    在这里插入图片描述

    展开全文
  • QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,...

    引言

    QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。(本篇主要介绍菜单栏和工具栏)
    在这里插入图片描述

    **

    一,菜单栏

    **
    一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
    创建菜单栏。

    QMenuBar* menuBar = new QMenuBar(this);
    

    创建菜单,调用 QMenu 的成员函数 addMenu 来添加菜单

    QAction* addMenu(QMenu * menu)
    QMenu* addMenu(const QString & title) 
    QMenu* addMenu(const QIcon & icon, const QString & title)
    

    创建菜单项,调用 QMenu 的成员函数 addAction 来添加菜单项

    QAction* activeAction() 
    QAction* addAction(const QString & text) 
    QAction* addAction(const QIcon & icon, const QString & text) 
    QAction* addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0) 
    QAction* addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)
    

    实例演示:(vs2019+qt5)

    //创建菜单栏
        QMenuBar* menuBar = new QMenuBar(this);
    //创建菜单(用addMenu方法添加入菜单栏)
        QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));
    //创建菜单项
        QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));
        QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));
    //给菜单项添入图标
        openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
        opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));
    //用addAction加入菜单项
        filename->addAction(opendlg);
        filename->addAction(openfile);
    

    在这里插入图片描述

    注意:使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。

    资源文件的添加

    openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
    

    对于该句代码":/D:/image/Luffy.png"是以相对路径添加的(即以:/开头的是资源文件),那么如何添加资源文件呢?
    添加->新建项->Qt->Qt Resource File。

    **在Resource1.qrc中添加说需要的资源(比如图片)**在这里插入图片描述

    最后以**冒号+前缀+名称(相对路径)**写入资源。

    **

    二,工具栏

    **
    主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
    添加头文件

    • 直接调用 QMainWindow 类的 addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数
      插入属于工具条的动作,即在工具条上添加操作。通过 QToolBar 类的 addAction 函数添加
      工具条是一个可移动的窗口,它的停靠区域由 QToolBar 的 allowAreas 决定,包括:
      1.Qt::LeftToolBarArea 停靠在左侧
      2.Qt::RightToolBarArea停靠在右侧
      3.Qt::TopToolBarArea 停靠在顶部
      4.Qt::BottomToolBarArea停靠在底部
      5.Qt::AllToolBarAreas以上四个位置都可停靠

    使用 setAllowedAreas()函数指定停靠区域:

    setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
    

    使用 setMoveable()函数设定工具栏的可移动性:

    setMoveable(false//工具条不可移动, 只能停靠在初始化的位置上
    

    **

    三,对话框 QDialog

    **
    对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。
    Qt 中使用 QDialog 类实现对话框。就像主窗口一样,我们通常会设计一个类继承 QDialog。QDialog(及其子类,以及所有 Qt::Dialog 类型的类)的对于其parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶
    层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent的中心)。
    顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

    Qt的内置对话框大致分为以下几类:
    QColorDialog: 选择颜色
    QFileDialog: 选择文件或者目录
    QFontDialog: 选择字体
    QInputDialog: 允许用户输入一个值,并将其值返回
    QMessageBox:模态对话框,用于显示信息、询问问题,消息,警告,错误。
    QPageSetupDialog:为打印机提供纸张相关的选项
    QPrintDialog:打印机配置
    QPrintPreviewDialog:打印预览
    QProgressDialog:显示操作过程
    1️⃣对话框分为模态对话框和非模态对话框。
    模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
    与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。
    模态与非模态的实现:
    使用 QDialog::exec()实现应用程序级别的模态对话框
    当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
    使用 QDialog::open()实现窗口级别的模态对话框
    该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式。
    使用 QDialog::show()实现非模态对话框
    模态对话框实例:

    我们调用了 exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。

    QDialog dlg1(this);
    dlg1.resize(300,200);
    dlg1.setWindowTitle(QStringLiteral("模态对话框"));
    dlg1.exec();
    

    非模态对话框实例:

    下面我们试着将 exec()修改为 show(),看看非模态对话框:

    QDialog dlg1(this);
    dlg1.resize(300,200);
    dlg1.setWindowTitle(QStringLiteral("模态对话框"));
    dlg1.show();
    

    是不是事与愿违?对话框竟然一闪而过!这是因为,show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。注意,dialog 是建立在栈上的,show()函数返回,函数结束,dialog超出作用域被析构,因此对话框消失了。知道了原因就好改了,我们将 dialog改成堆上建立(即new一个对象),当然就没有这个问题了。
    *QDialog dlg2 = new QDialog();
    dlg2->resize(200, 200);
    dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存
    dlg2->show();

    注意:在堆上就不能用点(.)了,要用->。而且由于使用 new 在堆上分配空间,却一直没有 delete。因此我们用setAttribute()函数设置对话框关闭时,自动销毁对话框。

    2️⃣消息对话框 (QMessageBox)

    QMessageBox :模态对话框,用于显示信息、询问问题等;我们一般会使用该类提供的几个 static成员函数:(静态成员函数有两种访问方式:1 创建对象 ;2 直接通过类名去调用)

    显示关于对话框

    void about(QWidget * parent, const QString & title, const QString & text)
    

    这是一个最简单的对话框,其标题是 title,内容是 text,父窗口是parent。对话框只有一个 OK 按钮。

    显示错误对话框

    StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
    

    这个对话框将显示一个红色的错误符号。我们可以通过 buttons 参数指明其显示的按钮 。 默认情况下只有一个Ok按钮 ,我们可以使用StandardButtons 类型指定多种按钮,指令如下:
    在这里插入图片描述
    示例:

    QMessageBox::critical(this, QStringLiteral("error"), QStringLiteral("错误"),QMessageBox::No);
    

    第一个参数是 父类,第二个是标题,第三个是内容,第四个是按钮名称(类型为StandardButtons,可以有两个做选择),第五个参数是默认(按钮类型为StandardButtons)。
    在这里插入图片描述
    显示信息对话框

    StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
    

    示例:

    QMessageBox::information(this, QStringLiteral("信息"), "infor", QMessageBox::Ok);
    

    在这里插入图片描述

    显示问题对话框

    StandardButton question(QWidget * parent, const QString & title,const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
    

    示例:

    //获取点击信息
    if (QMessageBox::Yes== QMessageBox::question(this, QStringLiteral("问题"), "question", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
            {
                qDebug() << "click yes";
            } 
            else
            {
                qDebug() << "click no";
    
            }
    

    在这里插入图片描述

    3️⃣标准文件对话框

    QFileDialog,也就是文件对话框。
    我们使用 QFileDialog::getOpenFileName()来获取需要打开的文件的路径。这个函数原型如下:

    QString getOpenFileName(QWidget * parent = 0,                //父窗口
                            const QString & caption = QString(), //对话框标题
                            const QString & dir = QString(),     //对话框打开的默认路径
                            const QString & filter = QString(),  //过滤器(例如我们使用“imagefile(*.jpg*.png)”则只显示jpg和png文件。多个过滤器用“;;”分割。
                            QString * selectedFilter = 0,        //默认选择的过滤器
                            Options options = 0                  //对话框的参数设定
                           )
    

    QFileDialog::getOpenFileName()返回值是选择的文件路径。我们将其赋值给path。通过判断 path 是否为空,可以确定用户是否选择了某一文件。只有当用户选择了一个文件时,我们才执行下面的操作。
    下面是最主要的 openFile()和 saveFile()这两个函数的代码:

    //打开文件 
    void MainWindow::openFile()
    { 
    QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); 
    if(!path.isEmpty()) 
    { 
    QFile file(path); 
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
     { 
    QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path)); 
    return; 
    }
    QTextStream in(&file); 
    textEdit->setText(in.readAll()); 
    file.close(); 
    }
    else 
    { 
    QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));
     } 
    }
    
    //保存文件 
    void MainWindow::saveFile() 
    { 
    QString path = QFileDialog::getSaveFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); 
    if(!path.isEmpty()) 
    { 
    QFile file(path);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 
    { 
    QMessageBox::warning(this, tr("Write File"), tr("Cannot open file:\n%1").arg(path)); 
    return; 
    }
    QTextStream out(&file); 
    out << textEdit->toPlainText(); 
    file.close(); 
    }
    else
     { 
    QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); 
     }
    }
    

    4️⃣其他对话框

    颜色对话框

     QColor color=    QColorDialog::getColor(QColor(255, 0, 0));//设置默认颜色:红色,用color接收选取的颜色
    

    字体对话框

     bool flag;
     QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
    

    演示示例

    在菜单栏中打开上述对话框,并制定界面。

    #include "aaa.h"
    #include"qmenubar.h"
    #include"qdialog.h"
    #include"qfiledialog.h"
    #include"qtoolbar.h"
    #include"qmessagebox.h"
    #include"qdebug.h"
    #include"qcolordialog.h"
    #include"qfontdialog.h"
    
    aaa::aaa(QWidget *parent)
        : QWidget(parent)
    {
    
        //菜单文件
        // 使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。
        QMenuBar* menuBar = new QMenuBar(this);
        QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));
        QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));
        QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));
        QAction* openmessage = new QAction(QStringLiteral("打开消息对话框(&D)"));
        QAction* opencolor = new QAction(QStringLiteral("打开颜色对话框(&D)"));
        QAction* openfont = new QAction(QStringLiteral("打开字体对话框(&D)"));
    
        //设置图标
        opencolor->setIcon(QIcon(":/D:/image/sunny.png"));
        openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
        opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));
        openmessage->setIcon(QIcon(":/D:/image/up.png"));
        openfont->setIcon(QIcon(":/D:/image/sunny.png"));
    
        //加入主菜单
        filename->addAction(openmessage);
        filename->addAction(opendlg);
        filename->addAction(openfile);
        filename->addAction(opencolor);
        filename->addAction(openfont);
    
        //打开对话框
        connect(opendlg, &QAction::triggered, [=]() {
            //模态对话框(不可对其他对话框操作)
            QDialog dlg1(this);
            dlg1.resize(300,200);
            dlg1.setWindowTitle(QStringLiteral("模态对话框"));
            dlg1.exec();
            //非模态对话框(可以对其他对话框操作)
           // QDialog *dlg2 = new QDialog();
            //dlg2->resize(200, 200);
            //dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存
            //dlg2->show();
            });
    
        //打开文件
        connect(openfile, &QAction::triggered, [=]() {
            QFileDialog fdlg(this);
            fdlg.getOpenFileName(this, QStringLiteral("选择文件"), "D:\\", tr("Image(*.jpg*.png)")); 
            });
    
        //打开消息对话框
        connect(openmessage, &QAction::triggered, [=]() {
            if (QMessageBox::Yes== QMessageBox::question(this, QStringLiteral("问题"), "question", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
            {
                qDebug() << "click yes";
            } 
            else
            {
                qDebug() << "click no";
    
            }
            });
        //打开颜色对话框
        connect(opencolor, &QAction::triggered, [=]() {
            QColor color=    QColorDialog::getColor(QColor(255, 0, 0));//设置默认颜色:红色,用color接收选取的颜色
            });
    
        //打开字体对话框
        connect(openfont, &QAction::triggered, [=]() {
            bool flag;
            QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
            qDebug() << QStringLiteral("字体") << font.family() << QStringLiteral("字号") << font.pointSize();
            });
        ui.setupUi(this);
    }
    
    展开全文
  • QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如...

    引言

    QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。(本篇主要介绍菜单栏和工具栏)


     一,菜单栏

    一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
    • 创建菜单栏。
    QMenuBar* menuBar = new QMenuBar(this);
    
    • 创建菜单,调用 QMenu 的成员函数 addMenu 来添加菜单 
    QAction* addMenu(QMenu * menu)
    QMenu* addMenu(const QString & title)
    QMenu* addMenu(const QIcon & icon, const QString & title)
    • 创建菜单项,调用 QMenu 的成员函数 addAction 来添加菜单项
    QAction* activeAction() 
    QAction* addAction(const QString & text)
    QAction* addAction(const QIcon & icon, const QString & text)
    QAction* addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0)
    QAction* addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)

    实例演示:(vs2019+qt5)

     //创建菜单栏
        QMenuBar* menuBar = new QMenuBar(this);
    //创建菜单(用addMenu方法添加入菜单栏)
        QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));
    //创建菜单项
        QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));
        QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));
    //给菜单项添入图标
        openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
        opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));
    //用addAction加入菜单项
        filename->addAction(opendlg);
        filename->addAction(openfile);
    

     注意:使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。


     资源文件的添加

    openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
    
    对于该句代码":/D:/image/Luffy.png"是以相对路径添加的(即以:/开头的是资源文件),那么如何添加资源文件呢?
    
    • 添加->新建项->Qt->Qt Resource File。
    •  在Resource1.qrc中添加说需要的资源(比如图片)

    最后以冒号+前缀+名称(相对路径)写入资源。


    二,工具栏

    主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。 
    添加头文件
    • 直接调用 QMainWindow 类的 addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数
    • 插入属于工具条的动作,即在工具条上添加操作。通过 QToolBar 类的 addAction 函数添加
    • 工具条是一个可移动的窗口,它的停靠区域由 QToolBar 的 allowAreas 决定,包括:
    1.  Qt::LeftToolBarArea  停靠在左侧
    2. Qt::RightToolBarArea停靠在右侧
    3. Qt::TopToolBarArea  停靠在顶部
    4. Qt::BottomToolBarArea停靠在底部
    5. Qt::AllToolBarAreas以上四个位置都可停靠

    使用 setAllowedAreas()函数指定停靠区域:

    setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
    
    使用 setMoveable()函数设定工具栏的可移动性:
    setMoveable(false)//工具条不可移动, 只能停靠在初始化的位置上
    

    三,对话框 QDialog 

    对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。 
    Qt 中使用 QDialog 类实现对话框。就像主窗口一样,我们通常会设计一个类继承 QDialog。QDialog(及其子类,以及所有 Qt::Dialog 类型的类)的对于其parent 指针都有额外的解释: 如果 parent 为 NULL,则该对话框会作为一个顶
    层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent的中心)。
    顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。 
    Qt的内置对话框大致分为以下几类: 
    • QColorDialog: 选择颜色
    • QFileDialog:    选择文件或者目录
    • QFontDialog:   选择字体
    • QInputDialog:  允许用户输入一个值,并将其值返回
    • QMessageBox:模态对话框,用于显示信息、询问问题,消息,警告,错误。
    • QPageSetupDialog:为打印机提供纸张相关的选项
    • QPrintDialog:打印机配置
    • QPrintPreviewDialog:打印预览
    • QProgressDialog:显示操作过程
    1️⃣对话框分为模态对话框和非模态对话框。
    • 模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
    • 与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。
    模态与非模态的实现:
    • 使用 QDialog::exec()实现应用程序级别的模态对话框
    当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
    • 使用 QDialog::open()实现窗口级别的模态对话框
    该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。 窗口级别的模态尤其适用于多窗口模式。
    • 使用 QDialog::show()实现非模态对话框

    模态对话框实例:

    我们调用了 exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。
    QDialog dlg1(this);
    dlg1.resize(300,200);
    dlg1.setWindowTitle(QStringLiteral("模态对话框"));
    dlg1.exec();
    

    非模态对话框实例:

    下面我们试着将 exec()修改为 show(),看看非模态对话框:
    QDialog dlg1(this);
    dlg1.resize(300,200);
    dlg1.setWindowTitle(QStringLiteral("模态对话框"));
    dlg1.show();
    
    是不是事与愿违?对话框竟然一闪而过!这是因为,show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。注意,dialog 是建立在栈上的,show()函数返回,函数结束,dialog超出作用域被析构,因此对话框消失了。知道了原因就好改了,我们将 dialog改成堆上建立(即new一个对象),当然就没有这个问题了。
    QDialog *dlg2 = new QDialog();
    dlg2->resize(200, 200);
    dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存
    dlg2->show();
    

    注意:在堆上就不能用点(.)了,要用->。而且由于使用 new 在堆上分配空间,却一直没有 delete。因此我们用setAttribute()函数设置对话框关闭时,自动销毁对话框。

    2️⃣消息对话框 (QMessageBox)

     QMessageBox :模态对话框,用于显示信息、询问问题等;我们一般会使用该类提供的几个 static成员函数:(静态成员函数有两种访问方式:1 创建对象 ;2 直接通过类名去调用)

    • 显示关于对话框
    void about(QWidget * parent, const QString & title, const QString & text)
    

    这是一个最简单的对话框,其标题是 title,内容是 text,父窗口是parent。对话框只有一个 OK 按钮。

    • 显示错误对话框
    StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
    

    这个对话框将显示一个红色的错误符号。我们可以通过 buttons 参数指明其显示的按钮 。 默认情况下只有一个Ok按钮 ,我们可以使用StandardButtons 类型指定多种按钮,指令如下:

    示例:

    QMessageBox::critical(this, QStringLiteral("error"), QStringLiteral("错误"),QMessageBox::No);
    

    第一个参数是 父类,第二个是标题,第三个是内容,第四个是按钮名称(类型为StandardButtons,可以有两个做选择),第五个参数是默认(按钮类型为StandardButtons)。

     

    • 显示信息对话框
    StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
    

     示例:

    QMessageBox::information(this, QStringLiteral("信息"), "infor", QMessageBox::Ok);
    

     

    • 显示问题对话框
    StandardButton question(QWidget * parent, const QString & title,const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
    

     示例:

    //获取点击信息
    if (QMessageBox::Yes== QMessageBox::question(this, QStringLiteral("问题"), "question", QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { qDebug() << "click yes"; } else { qDebug() << "click no"; }

     3️⃣标准文件对话框

    QFileDialog,也就是文件对话框。
    我们使用 QFileDialog::getOpenFileName()来获取需要打开的文件的路径。这个函数原型如下: 
    QString getOpenFileName(QWidget * parent = 0,                //父窗口
                            const QString & caption = QString(), //对话框标题
                            const QString & dir = QString(),     //对话框打开的默认路径
                            const QString & filter = QString(),  //过滤器(例如我们使用“imagefile(*.jpg*.png)”则只显示jpg和png文件。多个过滤器用“;;”分割。
                            QString * selectedFilter = 0,        //默认选择的过滤器
                            Options options = 0                  //对话框的参数设定
                           )
    
    QFileDialog::getOpenFileName()返回值是选择的文件路径。我们将其赋值给path。通过判断 path 是否为空,可以确定用户是否选择了某一文件。只有当用户选择了一个文件时,我们才执行下面的操作。
    下面是最主要的 openFile()和 saveFile()这两个函数的代码:
    //打开文件 
    void MainWindow::openFile()
    { 
    QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); 
    if(!path.isEmpty()) 
    { 
    QFile file(path); 
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
     { 
    QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path)); 
    return; 
    }
    QTextStream in(&file); 
    textEdit->setText(in.readAll()); 
    file.close(); 
    }
    else 
    { 
    QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));
     } 
    }
    
    //保存文件 
    void MainWindow::saveFile() 
    { 
    QString path = QFileDialog::getSaveFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); 
    if(!path.isEmpty()) 
    { 
    QFile file(path);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 
    { 
    QMessageBox::warning(this, tr("Write File"), tr("Cannot open file:\n%1").arg(path)); 
    return; 
    }
    QTextStream out(&file); 
    out << textEdit->toPlainText(); 
    file.close(); 
    }
    else
     { 
    QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); 
     }
    }
    

    4️⃣其他对话框

    • 颜色对话框
     QColor color=    QColorDialog::getColor(QColor(255, 0, 0));//设置默认颜色:红色,用color接收选取的颜色
    
    • 字体对话框
     bool flag;
     QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
    

     演示示例

    在菜单栏中打开上述对话框,并制定界面。

    #include "aaa.h"
    #include"qmenubar.h"
    #include"qdialog.h"
    #include"qfiledialog.h"
    #include"qtoolbar.h"
    #include"qmessagebox.h"
    #include"qdebug.h"
    #include"qcolordialog.h"
    #include"qfontdialog.h"
    
    aaa::aaa(QWidget *parent)
        : QWidget(parent)
    {
    
        //菜单文件
        // 使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。
        QMenuBar* menuBar = new QMenuBar(this);
        QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));
        QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));
        QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));
        QAction* openmessage = new QAction(QStringLiteral("打开消息对话框(&D)"));
        QAction* opencolor = new QAction(QStringLiteral("打开颜色对话框(&D)"));
        QAction* openfont = new QAction(QStringLiteral("打开字体对话框(&D)"));
    
        //设置图标
        opencolor->setIcon(QIcon(":/D:/image/sunny.png"));
        openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
        opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));
        openmessage->setIcon(QIcon(":/D:/image/up.png"));
        openfont->setIcon(QIcon(":/D:/image/sunny.png"));
    
        //加入主菜单
        filename->addAction(openmessage);
        filename->addAction(opendlg);
        filename->addAction(openfile);
        filename->addAction(opencolor);
        filename->addAction(openfont);
    
        //打开对话框
        connect(opendlg, &QAction::triggered, [=]() {
            //模态对话框(不可对其他对话框操作)
            QDialog dlg1(this);
            dlg1.resize(300,200);
            dlg1.setWindowTitle(QStringLiteral("模态对话框"));
            dlg1.exec();
            //非模态对话框(可以对其他对话框操作)
           // QDialog *dlg2 = new QDialog();
            //dlg2->resize(200, 200);
            //dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存
            //dlg2->show();
            });
    
        //打开文件
        connect(openfile, &QAction::triggered, [=]() {
            QFileDialog fdlg(this);
            fdlg.getOpenFileName(this, QStringLiteral("选择文件"), "D:\\", tr("Image(*.jpg*.png)")); 
            });
    
        //打开消息对话框
        connect(openmessage, &QAction::triggered, [=]() {
            if (QMessageBox::Yes== QMessageBox::question(this, QStringLiteral("问题"), "question", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
            {
                qDebug() << "click yes";
            } 
            else
            {
                qDebug() << "click no";
    
            }
            });
        //打开颜色对话框
        connect(opencolor, &QAction::triggered, [=]() {
            QColor color=    QColorDialog::getColor(QColor(255, 0, 0));//设置默认颜色:红色,用color接收选取的颜色
            });
    
        //打开字体对话框
        connect(openfont, &QAction::triggered, [=]() {
            bool flag;
            QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
            qDebug() << QStringLiteral("字体") << font.family() << QStringLiteral("字号") << font.pointSize();
            });
        ui.setupUi(this);
    }
    

    展开全文
  • Java提供了创建图形用户界面的综合解决方案。一:菜单菜单能够简化选择操作,广泛应用于各种视窗应用程序。Java提供五个实现菜单的类:...菜单由供用户选择的菜单组成菜单项是JMenuITem、JCheckBoxMenuITem和J...
  • VB讲课笔记10:菜单对话框

    千次阅读 2018-03-14 06:46:11
    VB讲课笔记10:菜单对话框一、用户界面设计基础用户界面是应用程序最基本的组成部分,其内容包括界面基本元素的外观设计和实现相应功能的代码编制。 1、用户界面元素(User Interface Element) 窗体是用户界面...
  • 对话框不能像窗口那样任意地改变大小,在标题上也没有最小化、最大化按钮,取而代之的是帮助按钮。2.4.1 对话框组成和基本操作WindowsXP中的对话框用于向程序提供信息。对话框通常具有多个...
  • 该文介绍了Dreamweaver CS3 中使用“ Spry菜单栏”控件创建纵向的导航菜单,通过“属性”面板编辑“Spry 菜单栏”控件,以及通过修改对应SpryMenuBarVertical.css 文档中的CSS 规则来更改菜单栏的外观。关键词: ...
  • 【相关概念】窗口、命令、工具对话框 【主要内容】窗口的操作、菜单对话框元素及操作 一、概念 窗口:计算机应用程序的一个图形化操作界面,一个窗口代表一个相应的应用程序; 命令:与计算机对话的一种表达...
  • 98窗口的组成及操作 教学内容 windows 98窗口的组成及操作 教学目的1使学生掌握windows 95窗口操作的有关知识 2培养学生学习计算机的兴趣 3培养学生主动发现问题解决问题的能力 教学重点窗口的组成及其基本操作 课的...
  • (1)新建一个基于对话框的MFC程序,打开对话框属性设置界面,去掉对话框的标题和边界BORDER(vc和vs的设置相似,这里使用的是vs2015,界面与vc稍有不同), (2)在客户曲自绘一个标题和关闭按钮,需要使用到WM_...
  • 这个函数会返回窗口的菜单栏,如果没有菜单栏则会新创建一个。这也就解释了,为什么我们可以直接使用menuBar()函数的返回值,毕竟我们并没有创建一个菜单栏对象啊!原来,这就是menuBar()为我们创建好并且返回了的。...
  • 对话框 既能引起用户的注意,也可以接收用户的输入。可用来提示重要信息或提供用户选项。 对话框是AlertDialog类(常用的Dialog子类)的一个实例。 AppCompat兼容库能将部分最新系统的特色功能移植到Android旧版本...
  • 一、对话框Windows提供的标准对话框:打开文件、另存为、浏览文件夹、颜色对话框、字体对话框C#提供了两种特殊对话框:消息对话框、关于对话框1. 打开对话框 OpenFileDialog(1)Filter属性: Excel文件|*.xls ”,...
  • 更多组件■ 菜单栏 Menu菜单是很多GUI必不可少的一部分。要建立菜单,必须先创建菜单栏:menuBar =MenuBar()menu=Menu()item1= menu.Append(-1,"itemA") #itemA是显示在菜单上的名字item2 = menu.Append(-1,"itemB...
  • 窗口构件没有边界、标题栏与菜单栏,而且其大小不可以调整。如果用户在程序设计过程中,需要利用悬浮在其他构件上方的无边界矩形框显示信息,则窗口是最佳选择。例如:利用窗口可以实现显示产品信息的快闪屏,利用...
  • 菜单栏 1. File:文件菜单——文件操作 New Notebook:新建笔记本(notebook)。二级菜单可以选择新建笔记本的内核(安装语言时会自动安装内核,也可以手动安装内核)。 Open...:打开笔记本(notebook)。将打开一...
  • VC++程序设计与应用--对话框

    千次阅读 2021-12-31 23:23:59
    对话框的应用
  • 对象是一个没有边界和菜单栏的顶层窗口。     4)   Panel: 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板。不能单独存在,必须放置到其他容器中。   ...
  • 6、QT基础——对话框QDialog

    千次阅读 2021-04-16 13:27:00
    对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。 Qt 中使用...
  • MFC 对话框与控件的使用

    千次阅读 2021-12-06 20:35:29
    用VS编写关于MFC 对话框与控件的一个小项目
  • 1、窗口的组成窗口主要分四个部分:上部为标题栏、菜单栏、工具栏,下部为状态栏,左边为信息区,右边为工作区。标题栏:标题栏位于窗口的最上边,最左边是窗口图标(也就是控制菜单按钮);接下来是窗口标题,即窗口的...
  • 菜单栏、工具栏和状态栏是组成 Windows 程序图形界面的三个主要元素。大多数Windows应用程序都提供了菜单,作为用户与应用程序之间交互的一种途径。 菜单命令响应函数 首先,新建一个单文档类型的MFC 应用程序,...
  • 【QT】对话框dialog

    2022-06-24 15:20:16
    对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt 中使用QDialog...
  • PyQt主窗口、对话框

    千次阅读 2022-01-21 16:50:52
    一、主窗口(QMainWindow)   QMainWindow窗口可以包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也就是常说的GUI程序主窗口。 1、窗口样式  1、PyQt的基本窗口类型 Qt.Widget:默认窗口,有最小...
  • MATLAB程序设计教程(11)——MATLAB图形用户界面设计第11章 MATLAB图形用户界面设计11.1 菜单设计11.2 对话框设计11.3 图形用户界面设计工具11.1菜单设计11.1.1 建立用户菜单要建立用户菜单可用uimenu函数,因其调用...
  • MFC 对话框常用控件详解

    千次阅读 2019-08-19 10:24:28
    单选按钮使用时,一般是多个组成一组,组中每个单选按钮的选中状态具有互斥关系,即同组的单选按钮只能有一个被选中。 单选按钮有选中和未选中两种状态,为选中状态时单选按钮中心会出现一个蓝点,以标识选中状态。...
  • 模块五 菜单栏、工具栏、状态栏

    千次阅读 2010-09-29 17:30:00
    Visual Basic .NET 教程模块五菜单栏、工具栏、状态栏 能力目标:能够设计、创建和使用菜单、工具栏和状态栏 知识目标:掌握菜单控件、工具栏控件和状态栏控件常用的属性、方法和事件   ...
  • 菜单栏、工具栏和状态栏

    千次阅读 2015-11-12 15:07:22
    在之前的《添加动作》一文中,我们已经了解了,Qt 将用户与界面进行交互的元素抽象为一种...QAction可以添加到菜单上、工具上。期间,我们还详细介绍了一些细节问题,比如资源文件的使用、对象模型以及布局管

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,724
精华内容 9,489
热门标签
关键字:

对话框的组成菜单栏