窗口类介绍

news2024/11/26 11:16:24

目录

Qwidget

QDialog

 QMessageBox

QFileDialog

QFontDialog

 QColorDialog

QInputDialog

QProgressDialog

QMainWindow

菜单栏

工具栏

状态栏 

停靠窗口

窗口布局


Qwidget

常用的一些函数包括:

设置窗口的大小,尺寸,得到对应的尺寸,窗口的移动,以及设置窗口标题,图片等。

测试代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //设置窗口的一些属性
    setFixedSize(400 ,400);
    setMaximumSize(1200, 1200);
    setMinimumSize(200, 200);
    setWindowTitle("hello world");
    setWindowIcon(QIcon("D:\\hell.png"));
    this->move(100,100);//以主屏幕左上交为对照点
    
    //窗口标题改变,会发出该信号
    connect(this,&MainWindow::windowTitleChanged,this,[&](){
        ui->pushButton->setText("该窗口标题改变了");
    });
    
    //右键点击,发送菜单信号
    setContextMenuPolicy(Qt::CustomContextMenu);
    connect(this,&MainWindow::customContextMenuRequested,this,[]()
            {
                QMenu menu;
                menu.addMenu(("菜单1"));
                menu.addMenu(("菜单2"));
                menu.exec(QCursor::pos());//在当前点击位置显示
            });
}
//点击按钮,设置对应的处理方法
void MainWindow::on_push_clicked()
{
    QRect q=this->geometry();//不包括边框
    int k1=q.width();
    int k2=q.height();
    QString s1,s2,s3;
    s1.setNum(k1);
    s2.setNum(k2);
    s3=s1;
    s3+=" ";
    s3+=s2;
    ui->pushButton->setText(s3);
}
void MainWindow::on_pushButton_2_clicked()
{
    this->setWindowTitle("HHHHHHH");
    //this->windowTitleChanged("HHHHHHHHH");//标题被改变,会发出信号
}

QDialog

该窗口的父类是Qwidget,同时也新增了自己的一些信号函数等。

// 构造函数
QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());

// 模态显示窗口
[virtual slot] int QDialog::exec();
// 隐藏模态窗口, 并且解除模态窗口的阻塞, 将 exec() 的返回值设置为 QDialog::Accepted
[virtual slot] void QDialog::accept();
// 隐藏模态窗口, 并且解除模态窗口的阻塞, 将 exec() 的返回值设置为 QDialog::Rejected
[virtual slot] void QDialog::reject();
// 关闭对话框并将其结果代码设置为r。finished()信号将发出r;
// 如果r是QDialog::Accepted 或 QDialog::Rejected,则还将分别发出accept()或Rejected()信号。
[virtual slot] void QDialog::done(int r);

[signal] void QDialog::accepted();
[signal] void QDialog::rejected();
[signal] void QDialog::finished(int result);

代码:

void Dialog::on_pr_clicked()
{
    this->accept();//关闭模态窗口,exec() 的返回值设置为QDialog::Accepted,也发出finish,accepted信号

}
void Dialog::on_pa_clicked()
{
    this->reject();//将 exec() 的返回值设置为 QDialog::Rejected,也发出finish,rejected信号
}
void Dialog::on_pf_clicked()
{
    this->done(1);//也发出finish信号,与参数为1或2,还会发出accepted信号或reject信号
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{


    ui->setupUi(this);
    Dialog* d=new Dialog;

    connect(d,&Dialog::finished,this,[](){
        qDebug()<<"finsh信号发出";
    });
    connect(d,&QDialog::rejected,this,[](){
        qDebug()<<"rejec信号被发出#########";

    });
    int k=d->exec();

    if(k==Dialog::Rejected)
    {
        qDebug()<<"reject************";
    }
    else if(k==QDialog::Accepted)
    {
        qDebug()<<"accept*************";
    }
    else
    {
        qDebug()<<"done***********";
    }
}

其中QDialog有许多的子类,具备有不同得方法:

 QMessageBox

这些子类可以通过构造函数创建好对象,然后调用对应的函数。这个类可以显示一些简单的提示框, 用于展示警告、错误、问题等信息

但通过调用一些静态成员函数即可:

 例如:

void MainWindow::on_p_clicked()
{
    QMessageBox::about(this,"about","这是一个消息提示对话框");
    int ret=QMessageBox::question(this,"question","你要保存文件吗",QMessageBox::Cancel|QMessageBox::Save);
    if(ret==QMessageBox::Save)
    {
      QMessageBox::information(this,"information","保存success");
    }
}

QFileDialog

个类可以选择要打开/保存的文件或者目录,一般也只需要使用静态成员方法即可。

 看一些简单例子:

void MainWindow::on_pushButton_clicked()
{
    //打开一个存在的目录
    QString dirName = QFileDialog::getExistingDirectory(this, "打开目录", "D:\\Qt");
    QMessageBox::information(this, "打开目录", "您选择的目录是: " + dirName);
}


void MainWindow::on_pushButton_2_clicked()
{
    // 打开多个文件, 得到这多个文件的绝对路径
    QStringList fileNames = QFileDialog::getOpenFileNames(
        this, "Open File", "D:\\",
        "Images (*.png *.jpg);;Text files (*.txt)");
    QString names;
    for(int i=0; i<fileNames.size(); ++i)
    {
        names += fileNames.at(i) + " ";
    }
    QMessageBox::information(this, "打开文件(s)", "您选择的文件是: " + names);

}

QFontDialog

通过这个类我们可以得到一个进行字体属性设置的对话框窗口(QFont是一个字体类,可对字体属性进行设置)

通过这个类可以设置窗口的字体属性,如加粗,斜体,大小等。

  QFont::QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false);

  •     - family: 本地字库中的字体名, 通过 office 等文件软件可以查看
  •     - pointSize: 字体的字号
  •     - weight: 字体的粗细, 有效范围为 0 ~ 99
  •     - italic: 字体是否倾斜显示, 默认不倾斜

  // 设置字体
  void QFont::setFamily(const QString &family);
  // 根据字号设置字体大小
  void QFont::setPointSize(int pointSize);
  // 根据像素设置字体大小
  void QFont::setPixelSize(int pixelSize);

 对窗口字体进行设置:

例如:

void MainWindow::on_pushButton_3_clicked()
{
     QFont q("微软雅黑",12,QFont::Bold);
     this->setFont(q);//只对当前窗口生效
}

 QColorDialog

关于颜色的属性信息, 在QT框架中被封装到了一个叫QColor的类中,颜色都是基于红, 绿, 蓝这三种颜色调配而成的, 并且颜色还可以进行透明度设置, 默认是不透明的。

一些常见QColor类中的函数:

 一般可通过静态成员方法,返回一个颜色对话框。

  // 弹出颜色选择对话框, 并返回选中的颜色信息


  [static] QColor QColorDialog::getColor(
        const QColor &initial = Qt::white, 
        QWidget *parent = nullptr, const QString &title = QString(), 
        QColorDialog::ColorDialogOptions options = ColorDialogOptions());

参数解释:

  •     initial: 对话框中默认选中的颜色, 用于窗口初始化
  •     parent: 给对话框窗口指定父对象
  •     title: 对话框窗口的标题
  •     options: 颜色对话框窗口选项, 使用默认属性即可, 一般不需要设置

 例如:

void MainWindow::on_pushButton_4_clicked()
{
    QColor color = QColorDialog::getColor();
     qDebug()<<color.blue();
    qDebug()<<color.red();
    QString text = QString("red: %1, green: %2, blue: %3, 透明度: %4")
                       .arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha());
    ui->label->setText(text);
}

QInputDialog

 通过这个类我们可以得到一个输入对话框窗口, 根据实际需求我们可以在这个输入窗口中输入整形, 浮点型, 字符串类型的数据, 并且还可以显示下拉菜单供使用者选择。


[static] double QInputDialog::getDouble(
            QWidget *parent, const QString &title, 
            const QString &label, double value = 0, 
            double min = -2147483647, double max = 2147483647, 
            int decimals = 1, bool *ok = nullptr, 
            Qt::WindowFlags flags = Qt::WindowFlags());

// 得到一个可以输入整形数的对话框窗口, 返回对话框窗口中输入的整形数,参数解释:

  •   parent: 对话框窗口的父窗口
  •   title: 对话框窗口显示的标题信息
  •   label: 对话框窗口中显示的文本信息(用于描述对话框的功能)
  •   value: 对话框窗口中显示的整形值, 默认为 0
  •   min: 对话框窗口支持显示的最小数值
  •   max: 对话框窗口支持显示的最大数值
  •   step: 步长, 通过对话框提供的按钮调节数值每次增长/递减的量
  •   ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数
  •   flags: 对话框窗口的窗口属性, 使用默认值即可

 例如:

void MainWindow::on_pushButton_clicked()
{
    int ret = QInputDialog::getInt(this, "年龄", "您的当前年龄: ", 10, 1, 100, 2);
    QMessageBox::information(this, "年龄", "您的当前年龄: " + QString::number(ret));

}

void MainWindow::on_pushButton_2_clicked()
{
    QStringList items;
    items << "苹果" << "橙子" << "橘子" << "葡萄" << "香蕉" << "哈密瓜";
     QString item = QInputDialog::getItem(this, "请选择你喜欢的水果", "你最喜欢的水果:", items, 1, false);
    QMessageBox::information(this, "水果", "您最喜欢的水果是: " + item);
}

QProgressDialog

通过这个类我们可以得到一个带进度条的对话框窗口, 这种类型的对话框窗口一般常用于文件拷贝、数据传输等实时交互的场景中。

常用函数:

QProgressDialog::QProgressDialog(
    const QString &labelText, const QString &cancelButtonText, 
    int minimum, int maximum, QWidget *parent = nullptr,
    Qt::WindowFlags f = Qt::WindowFlags());

参数解释:

  •   labelText: 对话框中显示的提示信息
  •    cancelButtonText: 取消按钮上显示的文本信息
  •   minimum: 进度条最小值
  •   -maximum: 进度条最大值
  •    parent: 当前窗口的父对象
  •    f: 当前进度窗口的flag属性, 使用默认属性即可, 无需设置

// 信号
// 当单击cancel按钮时,将发出此信号。默认情况下,它连接到cancel()槽。
[signal] void QProgressDialog::canceled();

// 判断用户是否按下了取消键, 按下了返回true, 否则返回false
bool wasCanceled() const;

// 设置窗口的显示状态(模态, 非模态)
/*
参数:
    Qt::NonModal  -> 非模态
    Qt::WindowModal    -> 模态, 阻塞父窗口
    Qt::ApplicationModal -> 模态, 阻塞应用程序中的所有窗口
*/
void QWidget::setWindowModality(Qt::WindowModality windowModality);

 例如:

void MainWindow::on_pushButton_3_clicked()
{
    QProgressDialog *progress = new QProgressDialog(
        "正在拷贝数据...", "取消拷贝", 0, 100, this);
    // 2. 初始化并显示进度条窗口
    progress->setWindowTitle("请稍后");
    progress->setWindowModality(Qt::WindowModal);
    progress->show();

    // 3. 更新进度条
    static int value = 0;
    QTimer *timer = new QTimer;
    connect(timer, &QTimer::timeout, this, [=]()
            {
                progress->setValue(value);
                value++;
                // 当value > 最大值的时候
                if(value > progress->maximum())
                {
                    timer->stop();
                    value = 0;
                    delete progress;
                    delete timer;
                }
            });
    connect(progress, &QProgressDialog::canceled, this, [=]()
            {
                timer->stop();
                value = 0;
                delete progress;
                delete timer;
            });
    timer->start(50);
}

QMainWindow

QMainWindow是标准基础窗口中结构最复杂的窗口, 其组成如下:

提供了菜单栏, 工具栏, 状态栏, 停靠窗口
菜单栏: 只能有一个, 位于窗口的最上方
工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠
状态栏: 只能有一个, 位于窗口最下方
停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠

菜单栏

 

 可对其手动添加QAction对象,也可在添加子菜单。

QAction类:

信号:单击菜单项, 该对象会发出一个信号

 关于窗口的设置,即可通过代码修改,也可在界面手动修改,例如:

    //设置菜单栏
    ui->menu->addAction("delete");
     QMenu* m= ui->menu->addMenu("second");
    m->addAction("save");
    
    //点击action,会发出信号
    connect(ui->save_action,&QAction::triggered,this,[&](){
        QMessageBox::information(this,"information","保存success");
    });

工具栏

与上面类似,创建QAction对象, 然后拖拽到工具栏中, 和添加菜单项的方式相同,不通过UI界面直接操作,那么就需要调用相关的API函数了。

常用API:

// 在QMainWindow窗口中添加工具栏
void QMainWindow::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar);
void QMainWindow::addToolBar(QToolBar *toolbar);
QToolBar *QMainWindow::addToolBar(const QString &title);

// 将Qt控件放到工具栏中
// 工具栏类: QToolBar
// 添加的对象只要是QWidget或者启子类都可以被添加
QAction *QToolBar::addWidget(QWidget *widget);

// 添加QAction对象
QAction *QToolBar::addAction(const QString &text);
QAction *QToolBar::addAction(const QIcon &icon, const QString &text);

// 添加分隔线
QAction *QToolBar::addSeparator()

例如:

  //设置工具栏, // 给工具栏添加按钮和单行输入框
    ui->toolBar->addWidget(new QPushButton("搜索"));
    QLineEdit* edit = new QLineEdit;
    edit->setMaximumWidth(200);
    edit->setFixedWidth(100);
    ui->toolBar->addWidget(edit);
    // 添加QAction类型的菜单项
    ui->toolBar->addAction( "QQQ");

添加多个工具栏,可在ui界面上操作或则通过代码添加:

QToolBar* toolbar = new QToolBar("toolbar");
this->addToolBar(Qt::LeftToolBarArea, toolbar);

状态栏 

一般情况下, 需要在状态栏中添加某些控件, 显示某些属性, 使用最多的就是添加标签 QLabel

 这里状态栏显示信息与与那些按钮等重叠。

 例如:

    // 状态栏添加子控件
    // 按钮
    ui->statusbar->showMessage("我是状态栏",4000);
    QPushButton* button = new QPushButton("按钮");
    ui->statusbar->addWidget(button);
    // 标签
    QLabel* label = new QLabel("hello,world");
    ui->statusbar->addWidget(label);

    QTimer::singleShot(5000,this,[=](){
        button->show();
        label->show();
    });

停靠窗口

停靠窗口可以通过鼠标拖动停靠到窗口的上、下、左、右,或者浮动在窗口上方。如果需要这种类型的窗口必须手动添加,如果在非QMainWindow类型的窗口中添加了停靠窗口, 那么这个窗口是不能移动和浮动的。
浮动窗口在工具栏中, 直接将其拖拽到UI界面上即可。

 也可通过API进行设置。

窗口布局

通过将一些标签,控件放在容器中,进行布局设置(水平,垂直,网格)

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

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

相关文章

蓝海彤翔亮相2023新疆网络文化节重点项目“新疆动漫节”

9月22日上午&#xff0c;2023新疆网络文化节重点项目“新疆动漫节”&#xff08;以下简称“2023新疆动漫节”&#xff09;在克拉玛依科学技术馆隆重开幕&#xff0c;蓝海彤翔作为国内知名的文化科技产业集团应邀参与此次活动&#xff0c;并在美好新疆e起向未来动漫展映区设置展…

Ubuntu为什么键盘会出现乱字符

今天上午起来只是要简单打一个命令&#xff0c;需要输入一个"双引号&#xff0c;但是总是显示&#xff0c;我一开始以为是中了病毒&#xff0c;把键盘给改了&#xff0c;后来发现虚惊一场&#xff1a;出现这个原因是因为ubuntu的键盘设置有问题。 我把键盘设置为英国英语…

C++简单实现红黑树

目录 一、概念 二、红黑树的性质 三、红黑树的定义 四、红黑树的插入操作 情况一&#xff08;叔叔节点存在且为红色&#xff09;——变色向上调整&#xff1a; 情况二&#xff08;叔叔节点不存在或为黑色&#xff09;——旋转变色&#xff1a; 2.1叔叔节点不存在 2.2叔叔…

在 SDXL 上用 T2I-Adapter 实现高效可控的文生图

T2I-Adapter 是一种高效的即插即用模型&#xff0c;其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器&#xff0c;实现丰富的控制和编辑效果。 同期的 ControlNet 也有类似的…

Windows Server 2012 R2 安装 .NET Framework 4.6.1

服务器操作系统是 Windows Server 2012 R2 版本&#xff0c;在安装 .NET Framework 4.6.1 过程中出现报错&#xff0c;报错截图如下&#xff1a; 通过上报报错可以发现是缺少对应的 KB2919355 更新&#xff0c;只有安装了此依赖才能在 Windows 8.1 或 Windows Server 2012 R2 …

中秋海报设计技巧大公开

中秋节即将来临&#xff0c;为了帮助大家设计出完美的海报&#xff0c;本文将提供详细的步骤和技巧&#xff0c;让你轻松打造出令人满意的海报作品。 步骤一&#xff1a;注册并登录乔拓云后台&#xff0c;进入海报中心页面。 在制作海报之前&#xff0c;你需要先注册并登录乔拓…

yolov5-6.0使用改进

代码版本V6.0 源码 YOLOv5 v6.0 release 改动速览 推出了新的 P5 和 P6 ‘Nano’ 模型&#xff1a; YOLOV5n和YOLOV5n6。 Nano 将 YOLOv5s 的深度倍数保持为 0.33&#xff0c;但将 YOLOv5 的宽度倍数从 0.50 降低到 0.25&#xff0c;从而将参数从 7.5M 降低到 1.9M&#xff0…

Linux shell 脚本中, $@ 和$# 分别是什么意思

Linux shell 脚本中&#xff0c; 和 和 和# 分别是什么意思&#xff1f; $&#xff1a;表示所有脚本参数的内容 $#:表示返回所有脚本参数的个数。 示例&#xff1a;编写如下shell脚本&#xff0c;保存为test.sh #!/bin/sh echo “number:$#” echo “argume:$” 执行…

李宏毅机器学习第一课(结尾附作业模型详细分析)

机器学习就是让机器找一个函数f&#xff0c;这个函数f是通过计算机找出来的 如果参数少的话&#xff0c;我们可以使用暴搜&#xff0c;但是如果参数特别多的话&#xff0c;我们就要使用Gradient Descent Regression (输出的是一个scalar数值) Classification &#xff08;在…

dart flutter json 转 model 常用库对比 json_serializable json_model JsonToDart

1.对比 我是一个初学者,一直跟着教材用原生的json,最近发现实在太麻烦了.所以搜索了一下,发现真的有很多现成的解决方案. 网页 https://app.quicktype.io/?ldart 这个是测试下来最好用的 有很多选项,可以使用 json_serializable 也可以不使用 json_serializable 这是推荐最…

【模拟实现C语言库函数】atoi的模拟实现

#include <stdio.h> #include <assert.h> #include <string.h> #include <math.h> int my_atoi(const char* str) {assert(str);size_t len strlen(str);size_t j len - 1;// 个位&#xff08;1234中的4&#xff09;int ret str[j--] - 0;// 十位百…

基于PySide6的GUI程序开发全流程(看完就会)

本文详细记录了从零到一开发一个GUI程序的过程&#xff0c;想学PySide6的入门文章不二之选&#xff1b; 1 前言 1.1 开发框架的选择 GUI程序的开发方式太多了&#xff0c;这里肯定就是Python语言了&#xff0c;至于为什么&#xff0c;就不多描述了&#xff1b; 那么基于Pyth…

YOLov5 分割数据集的制作(详细过程+代码)

1.labelme 的使用 每张图片会对应生成一个&#xff1a; 以上已经画好所有的数据集&#xff08;&#xff01;&#xff01;&#xff09; 2.这里介绍一下如果都是没有变化的数据集&#xff0c;标签的位置都一样&#xff0c;如何批量生成这个数据集 我们先将第一个数据集复制2275…

红队打靶:THE PLANETS: MERCURY打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;Web渗透 第三步&#xff1a;获取初步立足点并搜集信息 第四步&#xff1a;软连接劫持sudo提权 总结与思考 写在开头 本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶&#xff0c;详述了…

C2. Powering the Hero (hard version)

题目&#xff1a;样例&#xff1a; 输入 5 5 3 3 3 0 0 6 0 3 3 0 0 3 7 1 2 3 0 4 5 0 7 1 2 5 0 4 3 0 5 3 1 0 0 4输出 6 6 8 9 4 思路&#xff1a; 贪心思维题&#xff0c;这道题要求的是一张一张的凑卡牌&#xff0c;凑到的是力量赋值卡就存储好&#xff0c;抽到 0 就是英…

智能驾驶、智能家居、智能工业中的 AI 关键基础设施,半导体厂商恩智浦的角色是什么?

我们来看一条七年前的真实新闻报道&#xff0c;2016 年《福布斯》在报道中提到“2020 年会有 1000 万台的自动驾驶汽车”。然而 2023 年的现在&#xff0c;真正实现 L4 级别自动驾驶的汽车&#xff0c;仍然远远没有达到这个预测的数量。 另一边&#xff0c;数据显示&#xff0c…

递归实例:汉诺塔问题(n个圆盘3个柱子abc 一次动一个盘子)

实例&#xff1a;汉诺塔问题 n个圆盘3个柱子abc 一次动一个盘子 把上面n-1个盘看成一个整体&#xff0c;下面1个盘看成一个整体 n-1盘经过c移动到b第n盘到cn-1盘经过a到c 1 3步就是小一规模的汉诺塔 移动次数递推式 h(x)2h(x-1)1 def hanoi(n, a, b, c):if n > 0:hano…

Flutter笔记:AnimationMean、AnimationMax 和 AnimationMin 三个类的用法

Flutter笔记 AnimationMean、AnimationMax 和 AnimationMin三个类的用法 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/…

第1篇 目标检测概述 —(3)YOLO系列算法

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLO&#xff08;You Only Look Once&#xff09;系列算法是一种目标检测算法&#xff0c;主要用于实时物体检测。相较于传统的目标检测算法&#xff0c;YOLO具有更快的检测速度和更高的准确率。YOLO系列算法的核心思想是将…

织梦CMS采集插件-DEDE插件大全

在如今充满信息爆炸的互联网时代&#xff0c;维护一个具有吸引力和活力的网站或博客是一项具有挑战性的任务。对于那些使用织梦CMS建立网站的用户来说&#xff0c;如何持续不断地更新内容以吸引访问者成为了一个突出的问题。 什么是织梦CMS自动采集插件&#xff1f;这些插件是为…