Qt入门6——Qt窗口

news2024/12/27 9:32:30

目录

1. QMenuBar 菜单栏

2. QToolBar 工具栏 

3. QStatusBar 状态栏 

4. QDockWidget 浮动窗口

5. QDialog 对话框 

5.1 Qt内置对话框

1. QMessageBox 消息对话框

2. QColorDialog 颜色对话框

3. QFileDialog 文件对话框

4. QFontDialog 字体对话框

5. QInputDialog 输入对话框


Qt窗口是通过QMainWindow类来实现的。

QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menubar)、多个工具栏(toolbars)、多个浮动窗口(铆接部件)(dockwidgets)、一个状态栏(statusbar)和一个中心部件(centralwidget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。

1. QMenuBar 菜单栏

Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题下面。

菜单栏中包含菜单,菜单中包含菜单项。

示例1:使用图形化界面创建:

1.新建项目时选择QMainWindow:

 2.选择mainwindow.ui:双击->编辑菜单名称

效果如图:


 示例2:编写代码创建菜单:

ainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.先创建一个菜单栏
    QMenuBar* menubar = new QMenuBar();
    this->setMenuBar(menubar);

    //2.先创建一个菜单栏
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("构建");
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);

    //3.给菜单添加菜单项
    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("打开");
    QAction* action3 = new QAction("保存");
    QAction* action4 = new QAction("另存为");
    QAction* action5 = new QAction("退出");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);
    menu1->addAction(action4);
    menu1->addAction(action5);

    //给action添加信号槽
    connect(action5,&QAction::triggered,this,&MainWindow::close);
}

效果如图:点击退出窗口关闭


示例3:给菜单增加快捷键

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    QMenuBar* menubar = new QMenuBar();
    this->setMenuBar(menubar);

    //创建菜单
    QMenu* menu1 = new QMenu("文件(&F)");
    QMenu* menu2 = new QMenu("编辑(&E)");
    QMenu* menu3 = new QMenu("构建(&B)");
    QMenu* menu4 = new QMenu("调试(&D)");
    QMenu* menu5 = new QMenu("工具(&T)");
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);
    menubar->addMenu(menu4);
    menubar->addMenu(menu5);

    //创建菜单项
    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    QAction* action3 = new QAction("菜单项3");
    QAction* action4 = new QAction("菜单项4");
    QAction* action5 = new QAction("菜单项5");
    menu1->addAction(action1);
    menu2->addAction(action2);
    menu3->addAction(action3);
    menu4->addAction(action4);
    menu5->addAction(action5);
}

效果如图:使用alt+F键


示例4:给菜单项添加快捷键

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenuBar* menubar = new QMenuBar();
    this->setMenuBar(menubar);

    QMenu* menu1 = new QMenu("文件(&F)");
    QMenu* menu2 = new QMenu("编辑(&E)");
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);

    //创建4个菜单项
    QAction* action1 = new QAction("菜单项1(&A)");
    QAction* action2 = new QAction("菜单项1(&W)");
    QAction* action3 = new QAction("菜单项1(&E)");
    QAction* action4 = new QAction("退出(&Q)");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);
    menu1->addAction(action4);

    //为了方便观察快捷键起作用,绑定槽函数令使用action4时退出窗口
    connect(action4,&QAction::triggered,this,&MainWindow::close);
}

效果如图:先alt+F,在alt+Q,窗口退出:


示例5: 添加子菜单

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    QMenuBar* menubar = new QMenuBar();
    this->setMenuBar(menubar);

    //创建菜单
    QMenu* menuParent1 = new QMenu("父菜单1");
    QMenu* menuParent2 = new QMenu("父菜单2");
    QMenu* menuChild1 = new QMenu("子菜单1");

    //将菜单放入菜单栏
    menubar->addMenu(menuParent1);
    menubar->addMenu(menuParent2);
    menuParent1->addMenu(menuChild1);

    //创建菜单项
    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    QAction* action3 = new QAction("菜单项3");
    QAction* action4 = new QAction("菜单项4");
    QAction* menuChild2 = new QAction("菜单2");
    menuParent1->addAction(menuChild2);

    //将菜单项放入菜单
    menuChild1->addAction(action1);
    menuChild1->addAction(action2);
    menuChild1->addAction(action3);
    menuChild1->addAction(action4);
}

效果如图:


示例6:添加分割线->使用addSeparator函数添加分割线

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    QMenuBar* menubar = new QMenuBar();
    this->setMenuBar(menubar);

    //创建菜单
    QMenu* menu1 = new QMenu("菜单1");
    QMenu* menu2 = new QMenu("菜单2");
    //将菜单放到菜单栏
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);

    //创建菜单项
    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    QAction* action3 = new QAction("菜单项3");
    QAction* action4 = new QAction("菜单项4");
    //将菜单项放入菜单 使用addSeparator添加分割线
    menu1->addAction(action1);
    menu1->addSeparator();
    menu1->addAction(action2);
    menu1->addSeparator();
    menu1->addAction(action3);
    menu1->addSeparator();
    menu1->addAction(action4);
}

示例7:添加图标

1.先以qrc文件的方式添加图片:

2.编写代码

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.  创建菜单栏
    QMenuBar* menubar = new QMenuBar();
    //    将菜单栏添加到窗口
    this->setMenuBar(menubar);

    //2.  创建菜单
    QMenu* menu = new QMenu("菜单");
    //    将菜单放入菜单栏
    menubar->addMenu(menu);

    //3.  创建菜单项
    QAction* action1 = new QAction("打开");
    action1->setIcon(QIcon(":/open.png"));
    QAction* action2 = new QAction("退出");
    action2->setIcon(QIcon(":/exit.png"));
    //    将菜单项放入菜单
    menu->addAction(action1);
    menu->addAction(action2);
}

 效果如图:


注意:

在以上所有实例中我们创建菜单栏(QMenuBar) 所写的代码均为:

    //1.  创建菜单栏
    QMenuBar* menubar = new QMenuBar();
    //    将菜单栏添加到窗口
    this->setMenuBar(menubar);

① 这样写会造成内存泄漏,原因是之前程序自己就已经创建好了一个QMenuBar,当设置新的QMenuBar进来时,就会导致旧的QMenuBar脱离了Qt的对象树,意味着后续就无法对这个对象进行释放了;

② 程序如果窗口关闭,对象树释放,此时进程也就结束了,进程结束,自然而然所有内存都被回收,上述所说的 内存泄漏也就不会造成影响,如果涉及到多窗口程序或者涉及到窗口之间的频繁跳转,内存泄漏问题可能就会愈加严重;

③ 所以规范的代码应该为:

    //1.  创建菜单栏
    QMenuBar* menubar = this->menuBar();
    //    将菜单栏添加到窗口
    this->setMenuBar(menubar);

代码的意思为:1.如果QMenuBar已经存在,直接获取并返回;2.如果QMenuBar不存在,就先创建一个新的再返回。

2. QToolBar 工具栏 

工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。可以有多个,也可以没有,它并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在。

 示例1:添加工具栏和快捷项

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.  创建工具栏   工具栏是需要手动创建出来的,自身不会创建(需包含头文件QToolBar)
    QToolBar* toolbar = new QToolBar();
    this->addToolBar(toolbar);

    //2.  创建快捷项
    QAction* action1 = new QAction("保存");
    QAction* action2 = new QAction("退出");
    //   为快捷项添加图标
    action1->setIcon(QIcon(":/open.png"));
    action2->setIcon(QIcon(":/exit.png"));
    //   将快捷项添加到工具栏
    toolbar->addAction(action1);
    toolbar->addAction(action2);

    //连接信号槽观察相应结果
    connect(action2,&QAction::triggered,this,&MainWindow::close);
}

效果如图:点击退出快捷项窗口关闭


示例2:在上述工具栏添加菜单栏

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.  创建菜单栏
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

    //1.  创建工具栏   工具栏是需要手动创建出来的,自身不会创建(需包含头文件QToolBar)
    QToolBar* toolbar = new QToolBar();
    this->addToolBar(toolbar);

    //2.  创建两个菜单项/快捷项
    QAction* action1 = new QAction("保存");
    QAction* action2 = new QAction("退出");
    //   为菜单项/快捷项添加图标
    action1->setIcon(QIcon(":/open.png"));
    action2->setIcon(QIcon(":/exit.png"));
    //   将菜单项添加到菜单
    menuBar->addAction(action1);
    menuBar->addAction(action2);
    //   也可以将快捷项添加到工具栏
    toolbar->addAction(action1);
    toolbar->addAction(action2);

    //连接信号槽观察相应结果
    connect(action2,&QAction::triggered,this,&MainWindow::close);
}

 效果如图:


示例3:设置工具栏停靠位置

①在创建工具栏的同时,也可以设置工具栏的位置,其默认位置是在窗口的最上面;如上述代码,默认在最上面显示;

工具栏允许停靠的区域由QToolBar类提供的allowAreas()函数决定,其中可以设置的位置包括:

Qt::LeftToolBarArea 停靠在左侧;

Qt::RightToolBarArea 停靠在右侧;

Qt::TopToolBarArea 停靠在顶部;

Qt::BottomToolBarArea 停靠在底部;

Qt::AllToolBarAreas 以上四个位置都可停靠。

②工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置,

setFloatable()函数原型为: void setFloatable (bool floatable);

参数: true:浮动; false:不浮动;

③设置⼯具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置,

setMovable()函数原型为void setMovable(bool movable);

参数: true:浮动; false:不浮动。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.    创建两个工具栏
    QToolBar* toolbar1 = new QToolBar();
    QToolBar* toolbar2 = new QToolBar();

    //      设置toolbar1为默认停靠位置
    this->addToolBar(toolbar1);
    //      设置toolbar2停靠在左边
    this->addToolBar(Qt::LeftToolBarArea,toolbar2);

    //      只允许toolbar2停靠在左侧或右侧
    toolbar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //      设置toolbar2不允许浮动
    toolbar2->setFloatable(false);
    //      设置toolbar2不允许移动
    toolbar2->setMovable(false);

    //2.    创建快捷项
    QAction* action1 = new QAction("工具1");
    QAction* action2 = new QAction("工具2");
    QAction* action3 = new QAction("工具3");
    QAction* action4 = new QAction("工具4");
    //      将快捷项放入工具栏
    toolbar1->addAction(action1);
    toolbar1->addAction(action2);
    toolbar2->addAction(action3);
    toolbar2->addAction(action4);
}

效果如图: 

3. QStatusBar 状态栏 

状态栏是应用程序中输出简要信息的区域。一般位于主窗口的最底部,一个窗口最多只能有一个状态栏。在Qt中,状态栏是通过QStatusBar类来实现的。

在状态栏中可以显示的消息类型有:

实时消息:如当前程序状态;

永久消息:如程序版本号,机构名称;

进度消息:如进度条提示,百分百提示。

示例:创建一个状态栏,并放入一些控件

#include <QLabel>
#include <QProgressBar>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.创建状态栏
    QStatusBar* statusbar = this->statusBar();
    this->setStatusBar(statusbar);

    //让状态栏显示临时信息
    //statusbar->showMessage("这是一个状态栏");

    //2.给状态栏中添加子控件
    //添加QLabel
    QLabel* label = new QLabel("这是一个QLabel");
    statusbar->addWidget(label);
    //添加QProgressBar
    QProgressBar* progressbar = new QProgressBar();
    progressbar->setRange(0,100);
    progressbar->setValue(50);
    statusbar->addWidget(progressbar);
    //添加QPushButton
    QPushButton* button = new QPushButton("按钮");
    statusbar->addWidget(button);
}

 效果如图:

4. QDockWidget 浮动窗口

在Qt中,浮动窗口也称之为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口⼀般是位于核心部件的周围,可以有多个。

示例:给主窗口添加一个子窗口

 浮动窗口是位于中心部件的周围。可以通过QDockWidget类中提供setAllowedAreas()函数设置其允许停靠的位置。其中可以设置允许停靠的位置有:

Qt::LeftDockWidgetArea 停靠在左侧;

Qt::RightDockWidgetArea 停靠在右侧;

Qt::TopDockWidgetArea 停靠在顶部;

Qt::BottomDockWidgetArea 停靠在底部;

Qt::AllDockWidgetAreas 以上四个位置都可停靠。

#include <QDockWidget>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //给主窗口添加一个子窗口
    QDockWidget* dockwidget = new QDockWidget();
    //使用addDockWidget方法,把浮动窗口加入到子窗口中
    this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);

    //给浮动窗口设置标题
    dockwidget->setWindowTitle("浮动窗口");

    //给浮动窗口内部添加一些其他控件
    //不能直接给这个浮动窗口添加控件,而是需要先创建一个单独的QWidget,把要添加的控件加入到QWidget中
    //然后再把这个QWidget设置到dockwidget中
    QWidget* widget = new QWidget();
    dockwidget->setWidget(widget);

    //创建布局管理器,把布局管理器设置到QWidget中
    QVBoxLayout* layout = new QVBoxLayout;
    widget->setLayout(layout);

    //创建label到layout中
    QLabel* label = new QLabel("这是label");
    layout->addWidget(label);
    //创建按钮到layout中
    QPushButton* button = new QPushButton("按钮");
    layout->addWidget(button);

    //设置浮动窗口停靠的位置
    dockwidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}

 效果如图:

5. QDialog 对话框 

对话框是GUI程序中不可或缺的组成部分。⼀些不适合在主窗口实现的功能组件可以设置在对话框 中。对话框通常是⼀个顶层窗口,出现在程序最上层,⽤于实现短期任务或者简洁的用户交互。

Qt常用的内置对话框有:QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog (字体对话框)、QInputDialog(输入对话框)和QMessageBox(消息框)。

 示例1:在主窗口通过点击按钮弹出一个对话框

1.先创建一个QMainwindow项目

 2.增加按钮控件并编写槽函数

void MainWindow::on_pushButton_clicked()
{
    //创建一个对话框(需包含QDialog头文件)
    QDialog* dialog = new QDialog(this);
    //设置对话框标题
    dialog->setWindowTitle("标题!!");
    //设置对话框尺寸
    dialog->resize(400,300);
    //通过show方法显示出对话框
    dialog->show();

    //其实代码写到这里就可以结束了,但是应该思考一个问题
    //dialog是我们new出来的,每点击一次按钮都会创建一个新的dialog
    //所以在这里如果能考虑到内存泄漏的问题,那么代码就更完美了

    //delete dialog;
    //这样写会发现点击按钮后,对话框会一闪而过,即刚创建就被销毁了

    //正确的做法应该是把delete和按钮的点击信号关联起来
    //在点击按钮的时候,触发delete
    //Qt直接给QDialog设置了一个属性,可以通过设置属性,完成上述效果
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}

效果如图:


示例2:自定义对话框 

1. 在QMainwindow项目中,用图形化界面添加一个按钮:

 2.在QMainwindow项目中再添加一个Dialog类

2.在mainwindow.cpp中为主窗口的按钮设置槽函数

void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);
    dialog->resize(400,300);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

3.转到dialog.cpp为对话框编写代码

#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>

Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
    //创建出一些控件,加入到Dialog中(以Dialog作为父窗口)

    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);

    QLabel* label = new QLabel("这是一个对话框",this);
    QPushButton* button = new QPushButton("关闭",this);
    layout->addWidget(label);
    layout->addWidget(button);

    connect(button,&QPushButton::clicked,this,&Dialog::close);
}

效果如图:


示例3:使用图形化界面自定义对话框

1.同示例2的1

2.创建新文件

此时就出现了两个ui文件:

3.在dialog.ui中创建相应控件

4.

4.为主窗口的按钮设计槽函数

void MainWindow::on_pushButton_clicked()
{
    //弹出自定义对话框
    Dialog* dialog = new Dialog(this);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

5.为子窗口的按钮编写槽函数

void Dialog::on_pushButton_clicked()
{
    this->close();
}

效果如图:


示例4:模态对话框与非模态对话框 

模态对话框:弹出对话框时,用户无法操作父窗口,必须要完成对话框内部的操作,比如关闭对话框之后父窗口才能正常操作;

非模态对话框:弹出对话框时,用户可以操作父窗口。

很明显,以上示例的都是非模态对话框,要想实现模态对话框,只需将dialog->show();改为dialog->exec();

如示例3,将代码修改:

void MainWindow::on_pushButton_clicked()
{
    //弹出自定义对话框
    Dialog* dialog = new Dialog(this);
    dialog->setAttribute(Qt::WA_DeleteOnClose);

    //非模态对话框
    //dialog->show();
    //模态对话框
    dialog->exec();
}

效果如图:

5.1 Qt内置对话框

Qt提供了多种可复用的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常用标准对话框如下:

1. QMessageBox 消息对话框

QMessageBox用来显示一个消息给用户,并且让用户进行一个简单的选择。

QMessageBox类中定义了静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:

示例1:

(还是QMainwindow项目)

添加按钮后编写槽函数:

void MainWindow::on_pushButton_clicked()
{
    //创建QMessageBox(需包含QMessageBox头文件)
    QMessageBox* messagebox = new QMessageBox(this);
    messagebox->setWindowTitle("标题");
    messagebox->setText("文本!!!");
    messagebox->setIcon(QMessageBox::Warning);
    messagebox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);

    messagebox->exec();

    messagebox->setAttribute(Qt::WA_DeleteOnClose);
}

效果如图:


示例2:在示例1中我们希望为子窗口的按钮添加响应(自定义按钮)

void MainWindow::on_pushButton_clicked()
{
    //创建QMessageBox(需包含QMessageBox头文件)
    QMessageBox* messagebox = new QMessageBox(this);
    messagebox->setWindowTitle("标题");
    messagebox->setText("文本!!!");
    messagebox->setIcon(QMessageBox::Warning);

    //① 使用标准按钮,无法进行信号槽的连接。(按钮是QMessageBox自己生成的)
    messagebox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);

    //② 生成自定义按钮
//    QPushButton* button = new QPushButton("按钮",messagebox);
//    messagebox->addButton(button,QMessageBox::AcceptRole);
    //通过connect连接信号槽,针对当前点击的按钮进行相关操作

    //点击按钮,对话框关闭之后,此时就能获取到exec的返回值,以此就可以知道我们点击的是哪个按钮,从而执行需要的响应
    int result = messagebox->exec();
    if(result == QMessageBox::Ok){
        qDebug() << "Ok";
    }else if(result == QMessageBox::Save){
        qDebug() << "Save";
    }else if(result == QMessageBox::Cancel){
        qDebug() << "Cancel";
    }

    messagebox->setAttribute(Qt::WA_DeleteOnClose);
}

效果如图:


示例3:快速创建对话框(使用静态函数)

同样给按钮编写槽函数:

void MainWindow::on_pushButton_clicked()
{
    int result = QMessageBox::warning(this,"对话框标题","对话框文本",QMessageBox::Ok | QMessageBox::Cancel);
    if(result == QMessageBox::Ok){
        qDebug() << "Ok";
    }else if(result == QMessageBox::Cancel){
        qDebug() << "Canle";
    }
}

效果如图:

2. QColorDialog 颜色对话框

颜色对话框的功能是允许用户选择颜色。

常用方法介绍:

1.QColorDialog(QWidget*parent=nullptr) —— 创建对象的同时设置父对象;

2.QColorDialog(const QColor &initial, QWidget *parent = nullptr) —— 创建对象的同时通过QColor 对象设置默认颜色和父对象;

3.voidsetCurrentColor(const QColor &color)—— 设置当前颜色对话框;

4.QColorcurrentColor() const —— 获取当前颜色对话框;

5.QColorgetColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()) —— 打开颜色选择对话框,并返回⼀个QColor对象;

参数说明: initial:设置默认颜色;parent:设置父对象;title:设置对话框标题;options:设置选项

6.voidopen(QObject*receiver,constchar*member) —— 打开颜色对话框。

示例:

同样对按钮编写槽函数:

void MainWindow::on_pushButton_clicked()
{
    //函数的返回值就是选择的颜色
    QColor color = QColorDialog::getColor(QColor(0,255,255),this,"选择颜色");

    //基于选择的颜色改变窗口的背景色
    //方法①
    //QString style = "background-color:rgb(" + QString::number(color.red()) + " , " + QString::number(color.green())
                    + " , " + QString::number(color.blue()) + ");";

    //方法②
    char style[1024] = {0};
    sprintf(style,"background-color:rgb(%d,%d,%d);",color.red(),color.green(),color.blue());
    
    this->setStyleSheet(style);
}

效果如图:

3. QFileDialog 文件对话框

文件对话框用于应用程序中需要打开⼀个外部文件或需要将当前内容存储到指定的外部文件。

常用方法介绍:
① 打开文件(一次只能打开一个文件)

QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())

② 打开多个文件(一次打开多个文件)

QStringList getOpenFileNames(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())

③ 保存文件

QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())

参数说明:
参数1:parent 父亲;参数2:caption 对话框标题;参数3:dir 默认打开的路径

示例:

1.创建两个按钮

 2.编写槽函数

void MainWindow::on_pushButton_clicked()
{
    QFileDialog::getOpenFileName(this);
}

void MainWindow::on_pushButton_2_clicked()
{
    QFileDialog::getSaveFileName(this);
}

效果如图:

4. QFontDialog 字体对话框

Qt 中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。

示例:

void MainWindow::on_pushButton_clicked()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    ui->pushButton->setFont(font);
}

效果如图:

5. QInputDialog 输入对话框

Qt 中提供了预定义的输入对话框类:QInputDialog,用于进行临时数据输入的场合。

常用方法介绍:

1.双精度浮点型输入数据对话框

double getDouble(QWidget*parent,constQString&title, const QString&label, double value =0,doublemin=-2147483647,doublemax=2147483647,intdecimals=1,bool*ok =nullptr, Qt::WindowFlags flags = Qt::WindowFlags());

2.整型输入数据对话框

int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int min=-2147483647,intmax=2147483647,intstep=1,bool*ok=nullptr,Qt::WindowFlags flags = Qt::WindowFlags());

3.选择条目型输入数据框

QString getItem (QWidget*parent, const QString&title, const QString &label, const QStringList &items, int current = 0, bool editable = true, bool *ok =nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) ;

参数说明: parent:父亲;title:对话框标题;label:对话框标签;items:可供选择的条目

示例:

1.ui界面创建控件

2.编写槽函数

void MainWindow::on_pushButton_clicked()
{
    int result = QInputDialog::getInt(this,"整数输入对话框","请输入一个整数");
}

void MainWindow::on_pushButton_2_clicked()
{
    double result = QInputDialog::getDouble(this,"小数输入对话框","请输入一个小数");
}

void MainWindow::on_pushButton_3_clicked()
{
    QStringList items;
    items.push_back("哈哈哈哈");
    items.push_back("呵呵呵呵");
    items.push_back("嘻嘻嘻嘻");
    items.push_back("嘿嘿嘿嘿");
    QString item = QInputDialog::getItem(this,"条目输入对话框","请输入条目",items);
}

 3.效果如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A058-基于Spring Boot的餐饮管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

【VUE3】npm : 无法加载文件 D:\Program\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。

npm : 无法加载文件 D:\Program\nodejs\npm.ps1。未对文件 D:\Program\nodejs\npm.ps1 进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_ Execution_Policies。…

《JavaScript高级程序设计》读书笔记 17

感谢点赞、关注和收藏&#xff01; 这一篇讲内存相关&#xff0c;主要是垃圾回收机制。 垃圾回收 JavaScript 是使用垃圾回收的语言&#xff0c;也就是说执行环境负责在代码执行时管理内存。在 C 和 C等语言中&#xff0c;内存如何管理是开发者来决定的。JavaScript通过自动内…

c语言——数组名该如何理解呢?

一般情况下&#xff0c;数组名表示首元素地址&#xff0c;以下2种除外&#xff1a; ①、sizeof(数组名) 表示整个数组 ※只有数组名的情况 sizeof&#xff08;数组名i&#xff09; 就不能表示整个数组 ②、&数组名 表示整个数组&#xff0c;取的是整个数…

IDL学习笔记(一)数据类型、基础运算、控制语句

近期&#xff0c;需要用到modis数据批量预处理&#xff0c;于是重新学习idl,感谢郭师兄推荐&#xff0c;以及张洋老师的详细教导。特以此为学习笔记&#xff0c;望学有所成。 IDL学习笔记&#xff08;一&#xff09; 数据类型数据类型创建数组类型转换函数代码输出print往文件…

数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!

文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序&#xff0c;使用栈的数据结构非递归实现快排&#xff0c;优化快排&#xff08;三路…

【语音识别】Zipformer

Zipformer 是kaldi 团队于2024研发的序列建模模型。相比较于 Conformer、Squeezeformer、E-Branchformer等主流 ASR 模型&#xff0c;Zipformer 具有效果更好、计算更快、更省内存等优点。并在 LibriSpeech、Aishell-1 和 WenetSpeech 等常用数据集上取得了当时最好的 ASR 结果…

Python酷库之旅-第三方库Pandas(251)

目录 一、用法精讲 1186、pandas.tseries.offsets.BusinessMonthEnd.is_year_start方法 1186-1、语法 1186-2、参数 1186-3、功能 1186-4、返回值 1186-5、说明 1186-6、用法 1186-6-1、数据准备 1186-6-2、代码示例 1186-6-3、结果输出 1187、pandas.tseries.offs…

【06】Selenium+Python 定位动态ID

有时候页面元素的ID是动态变化的&#xff0c;这种变化的ID&#xff0c;无法通过By.ID来定位&#xff0c;也无法通过BY.XPATH的绝对路径来定位 比如此li标签的id&#xff0c;中间的数字部分就是变化的&#xff0c;刷新页面后&#xff0c;id中间部分的数字就会变化 刷新页面前ID:…

leetcode 之 二分查找(java)(2)

文章目录 74、搜索二维矩阵33、搜素旋转排序数组 74、搜索二维矩阵 题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff…

16asm - 汇编介绍 和 debug使用

文章目录 前言硬件运行机制微机系统硬件组成计算机系统组成8086cpu组织架构dosbox安装配置debug debug使用R命令D命令E命令U命令T命令A命令标志寄存器 总结 前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解 十六位汇编 和 debug调试器的使用 硬件运行…

UE4_材质节点_有关距离的_流体模拟

一、材质节点介绍&#xff1a; 特别注意&#xff1a;距离场需要独立显卡支持。 1、什么是距离场&#xff1f; 想象一下空间中只有两个实体, 一个球,一个圆柱. 空间由无数个点组成, 取其中任何一个点, 比如,它跟球面的最近距离是3, 跟圆柱面的最近距离是2, 那么这个点的值就…

win10系统安装docker-desktop

1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术&#xff0c;它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…

【小白学机器学习39】如何用numpy生成总体,生成样本samples

目录 1 目的&#xff1a;研究 样本和总体之间的关系 2 先生成1个理论总体 2.0 下面是关于这一步的完整代码 2.1 一般情况下&#xff0c;我们先生成一个符合正态分布的总体 2.1.1 设置总体 &#xff0c;或者说生成一个总体 2.2 为什么一定要是一个符合正态分布的总体&…

“指标管理系统”是什么?企业如何搭建指标管理系统?

在当今数字化时代&#xff0c;数据已成为企业决策的重要依据。然而&#xff0c;海量数据中如何筛选出关键指标&#xff0c;并对其进行有效管理&#xff0c;成为了众多企业面临的难题。为此&#xff0c;指标管理系统应运而生&#xff0c;它旨在帮助企业规范化定义、统一管理和高…

网际协议(IP)与其三大配套协议(ARP、ICMP、IGMP)

网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;&#xff0c;又称互联网协议。是OSI中的网络层通信协议&#xff0c;用于跨网络边界分组交换。它的路由功能实现了互联互通&#xff0c;并从本质上建立了互联网。网际协议IP是 TCP/IP 体系中两个最主要的协议之…

运维工作常用Shell脚本(Commonly Used Shell Scripts for Operation and Maintenance Work)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

机器学习8-决策树CART原理与GBDT原理

Gini 系数 和Gini 系数增益 CART决策树算法流程举例 该篇文章对于CART的算法举例讲解&#xff0c;一看就懂。 决策树(Decision Tree)—CART算法 同时也可以观看视频 分类树 GBDT原理举例 可以看如下示例可以理解GBDT的计算原理 用通俗易懂的方式讲解&#xff1a; GBDT算法及…

oracle中删除指定前缀的表

近期接手做的项目&#xff0c;发觉数据库中有许多多余的表。究其原因&#xff0c;应该是同事贪图方便&#xff0c;将过去做过的项目复制粘贴&#xff0c;然后修修改改。包括数据库也是克隆过来的&#xff0c;然后又没有删除本项目多余的表&#xff0c;结果经过几个轮回&#xf…

JAVA篇10 —— 常用类WrapperStringMathArraysSystemBigIntegerBigDecimal日期

欢迎来到我的主页&#xff1a;【一只认真写代码的程序猿】 本篇文章收录于专栏【小小爪哇】 如果这篇文章对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 1 包装类 1.1 包装类和String 1.2 int&char包装类常用方法 2 String类 3 Math 类 4 Arrays类 5 System类…