创建QWindow,自带菜单栏,工具栏等

QWindow实际上是在QWidget基础上派生出,自带了菜单栏,工具栏,状态栏等等的一个复杂的QWidget

创建项目

首先,创建项目时,从原来的QWidget变更为QMainWindow

菜单栏

获取菜单栏

QMainWindow自带一个菜单栏,通过其成员函数menuBar()可获得到菜单栏的对象指针。
菜单栏的类为QMenuBar,需要在开头include它,然后在MainWindow构造函数里写

QMenuBar *mBar=menuBar();

添加菜单

QMenuBar菜单栏中可以添加菜单,使用QmenuBar对象中的addMenu成员函数,它返回一个QMenu对象指针。

QMenu *pFile=mBar->addMenu("文件");

添加菜单项

QMenu菜单中可以添加菜单项,使用QMenu对象中的addAction成员函数,它返回一个QAction对象指针

    QAction *pNew=pFile->addAction("新建");

添加菜单项的触发事件

connect(pNew,&QAction::triggered,[=](){
       qDebug("新建被按下");
});

注意lambda表达式需要在配置文件中写入CONFIG += C++11

运行结果:
当我们按下新建时,将触发控制台输出代码如下,


添加分割线

    pFile->addSeparator();//添加分割线

更简单的菜单项添加

connect(pFile->addAction("打开"),&QAction::triggered,[=](){
        dDebug("打开被按下");
});

上述代码可一步添加菜单项并绑定信号和槽函数。

工具栏

如下如,上面是菜单栏,下面则是工具栏


image.png

一般地,一个程序中菜单栏唯一,工具栏不唯一,所以在QWindow中,自带成员函数addToolBar可自由添加工具栏

添加工具栏

QToolBar *toolBar=addToolBar("toolBar");

添加菜单项

    toolBar->addAction(pNew);

由此可以看出,工具栏和菜单项类似,也可添加动作


image.png

添加按钮

    QPushButton *b=new QPushButton(this);
    b->setText("^_^");
    toolBar->addWidget(b);
    connect(b,&QPushButton::pressed,[=](){
        b->setText("2333");
    });
    connect(b,&QPushButton::released,[=](){
        b->setText("^_^");
    });

效果如下图,当按下按钮时,按钮文字便为2333,松手时复原


image.png

状态栏

如图,状态栏(QStatusBar)一般是程序窗口最下方的一栏,在QWindow中,通过其成员函数statusBar()获得到


获取状态栏

    QStatusBar *sBar=statusBar();

添加控件

    QStatusBar *sBar=statusBar();
    QLabel *label=new QLabel(this);
    label->setText("这是状态栏上的第一个标签 ");

    //addWidget从左往右添加控件
    sBar->addWidget(label);
    sBar->addWidget(new QLabel("第二个标签",this));

    //addPermanentWidget从右往左添加控件
    sBar->addPermanentWidget(new QLabel("第三个",this));

运行效果如下


image.png

核心控件

核心控件为主要显示的控件内容,如添加一个文本编辑框可以使用如下代码

    QTextEdit *textEdit=new QTextEdit(this);  //创建一个文本编辑框
    setCentralWidget(textEdit);//设置窗口的中心组建

如下图,此时创建了一个文本编辑框


image.png

浮动窗口

    //一个浮动窗口
    QDockWidget *dock=new QDockWidget(this);

    //添加这个浮动窗口
    addDockWidget(Qt::RightDockWidgetArea,dock);

    //向浮动窗口再添加一个文本框
    QTextEdit *textEdit1=new QTextEdit(this);
    dock->setWidget(textEdit1);

如下下图,浮动窗口可嵌入主窗口的上下左右


image.png

浮动窗口还可分离为独立窗口


image.png

对话框(QDialog)

对话框有模态对话框和非模态对话框之分,
模态对话框在显示时,其父窗口无法进行任何操作
非模态对话框显示时,其父窗口仍可进行操作

模态对话框

如下代码可添加一个模态对话框,

    QMenu *pDialogMenu=mBar->addMenu("对话框");
    connect(pDialogMenu->addAction("模态对话框"),&QAction::triggered,[=](){
        qDebug("模态对话框打开");
        QDialog dig;
        dig.exec();
        qDebug("模态对话框关闭");
    });
image.png

此时,我们无法操作主窗口

非模态对话框

对于非模态对话框,直接调用其show()函数便可以显示一个独立的对话框了,但是如果我们把上述代码的exec改成show,我们发现对话框根本就没有弹出,这是因为lambda表达式在执行完毕后,自动将表达式内的所有变量自动回收,即生命周期结束。
一种方法是把对话框定义在lambda表达式之外,
还有一种方法是把对话框使用指针和new来动态分配空间定义。
如下代码,动态定义了一个非模态对话框并显示。

connect(pDialogMenu->addAction("非模态对话框"),&QAction::triggered,[=](){
        qDebug("非模态对话框");
        QDialog *dig=new QDialog();
        dig->show();
        qDebug("模态对话框已显示");
    });

上述代码运行可发现,点击非模态对话框后,控制台将直接输出

非模态对话框
模态对话框已显示

由此可知,show方法不会阻塞,而exec方法会阻塞
如果使用动态内存分配的对话框,关闭时并不会内存回收,我们需要做标记如下,当对话框关闭时,自动delete对话框对象.

dig->setAttribute(Qt::WA_DeleteOnClose);

标准对话框

Qt中自带了以下几种标准对话框


image.png

使用如下代码分别查看各个对话框的样式

    QMenu *pHelpMenu=mBar->addMenu("帮助");
    connect(pHelpMenu->addAction("about"),&QAction::triggered,[=](){
       QMessageBox::about(this,"about","OK");
    });
    connect(pHelpMenu->addAction("aboutQt"),&QAction::triggered,[=](){
       QMessageBox::aboutQt(this,"aboutQt");
    });
    connect(pHelpMenu->addAction("critical"),&QAction::triggered,[=](){
       QMessageBox::critical(this,"critical","This is a critical");
    });
    connect(pHelpMenu->addAction("information"),&QAction::triggered,[=](){
       QMessageBox::information(this,"information","This is an information");
    });
    connect(pHelpMenu->addAction("question"),&QAction::triggered,[=](){
       QMessageBox::question(this,"question","This is a question");
    });
    connect(pHelpMenu->addAction("warning"),&QAction::triggered,[=](){
       QMessageBox::warning(this,"warning","This is a warning");
    });

运行结果如下,


about

aboutQt

critical

infomation

question
warning

根据第一幅图中的说明定义,可看出除了about开头的方法外,其余方法调用后均返回一个StandardButton,我们可以根据返回值判断用户点击的按钮
如下图为问题对话框(question)中的选择分支代码,

    connect(pHelpMenu->addAction("question"),&QAction::triggered,[=](){
       int select=QMessageBox::question(this,"question","This is a question");
       switch(select){
       case QMessageBox::Yes:
           qDebug("Yes");
           break;
       case QMessageBox::No:
           qDebug("No");
           break;
       default:
           break;
       }
    });

如下图,此时我们点击两个按钮,可相应打印debug信息.


image.png

文件对话框

QFileDialog::getOpenFileName函数可打开一个文件对话框
参数分别为:

  • 父控件对象指针
  • 对话框标题
  • 初始文件路径
  • 文件类型
    connect(pDialogMenu->addAction("文件对话框"),&QAction::triggered,[=](){
        qDebug("文件对话框打开");
        QString path=QFileDialog::getOpenFileName(this,"open","../",
                  "Images (*.png *.xpm *.jpg);;"
                  "Text files (*.txt);;"
                  "XML files (*.xml)");
        qDebug("选中路径:");
        qDebug()<<path;
        qDebug("文件对话框关闭");
    });

对话框启动后,效果如下


image.png

且控制台输出如下:

文件对话框打开
选中路径:
"D:/qt-workspace/Example/ExampleFile.xml"
文件对话框关闭

注意:
如上代码,QFileDialog::getOpenFileName函数中的第四个参数,为文件类型过滤器,可以使用C++的一个语法糖自动拼接字符串实现多行文本

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342