Qt - 窗口

news2025/1/16 8:11:44

目录

1. 前言

2. 菜单栏(QMenuBar)

2.1. 创建菜单栏

2.1.1. 方式一

2.1.2. 方式二

2.2. 在菜单栏中添加菜单和创建菜单项

2.3. 在菜单项之间添加分割线

2.4. 综合示例

3. 工具栏(QToolBar)

3.1. 创建工具栏

3.2. 设置停靠位置

3.2.1. 方式一

3.2.2. 方式二

3.3. 设置浮动属性

3.4. 设置移动属性

4. 状态栏(QStatusBar)

4.1. 状态栏的创建

4.2. 在状态栏中显示实时消息

5. 浮动窗口(QDocWidget)

5.1. 浮动窗口的创建

5.2. 设置停靠的位置

6. 对话框(QFiledialog,QColorDialog,QFontDialog,QInputDialog,QMessageBox)

6.1. 模态对话框

6.1.1. 示例1:创建对话框

6.2. 非模态对话框

6.2.1. 示例1:

6.3. 消息对话框(QMessageBox)

6.3.1. 示例1:问题提示消息对话框

6.4. 颜色对话框(QColorDialog)

6.4.1. 示例1:

6.5. 文件对话框(QFileDialog)

6.5.1. 示例1:打开文件

6.6. 字体对话框(QFontDialog)

6.6.1. 示例1:

6.7. 输入对话框(QInputDialog)

6.7.1. 示例1:浮点型数据输入对话框

7. 小结


1. 前言

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

QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar),多个工具栏(tool bars), 多个浮动窗口(dock widgets),一个状态栏(status bar)和一个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为QMainWindow中各组件所处的位置

2. 菜单栏(QMenuBar)

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

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

2.1. 创建菜单栏

2.1.1. 方式一

菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现。menubar()函数原型如下:

2.1.2. 方式二

在堆上动态创建

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


    ui->setupUi(this);
    QMenuBar* menu = new QMenuBar(this);
    menu->addAction("菜单");
    menu->addAction("编辑");
    menu->addAction("视图");
    menu->addAction("关于");
    this->setMenuBar(menu);
}

使用setMenuBar把菜单放到窗口中.

2.2. 在菜单栏中添加菜单和创建菜单项

创建菜单,并通过QMenu提供的addMenu()函数来添加菜单

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


    ui->setupUi(this);
    QMenuBar* menu = new QMenuBar(this);
    // 创建菜单
    QMenu* m1 = new QMenu("文件");
    QMenu* m2 = new QMenu("编辑");

    // 将菜单添加到菜单栏上
    menu->addMenu(m1);
    menu->addMenu(m2);

    // 创建菜单项
    QAction* action = new QAction("打开文件夹");
    QAction* action1 = new QAction("save");

    // 将菜单项添加到菜单上
    m1->addAction(action);
    m2->addAction(action1);

    this->setMenuBar(menu);
}

2.3. 在菜单项之间添加分割线

在菜单项之间可以添加分割线。分割线是通过QMenu类提供的addSeparator()函数来实现的。

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


    ui->setupUi(this);
    QMenuBar* menu = new QMenuBar(this);
    QMenu* m1 = new QMenu("文件");
    QMenu* m2 = new QMenu("编辑");

    menu->addMenu(m1);
    menu->addMenu(m2);

    QAction* action = new QAction("打开文件夹");
    QAction* action1 = new QAction("save");

    m1->addAction(action);
    m1->addSeparator(); // 在action和action1中间添加分割线
    m1->addAction(action1);

    this->setMenuBar(menu);
}

2.4. 综合示例

  1. 新建Qt项目(基类选择QMainWindow)

  2. 在mainwindow.cpp文件中创建菜单和中央空间
    创建一个菜单栏,一个菜单。两个菜单项:保存和加载。创建一个QTextEdit作为窗口的中央空间
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{


    ui->setupUi(this);
    // 设置标题
    this->setWindowTitle("我的记事本");

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

    // 创建菜单
    QMenu* menu = new QMenu("文件");
    menuBar->addMenu(menu);

    // 创建菜单项
    QAction* action1 = new QAction("保存");
    QAction* action2 = new QAction("加载");
    menu->addAction(action1);
    menu->addAction(action2);

    // 创建中央控件
    QTextEdit* edit = new QTextEdit(this);
    this->setCentralWidget(edit);
    edit->setPlaceholderText("此处编写文本内容...");

}
  1. 给action添加一些动作
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QTextEdit>
#include <QFileDialog>
#include <QDebug>
#include <fstream>

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


    ui->setupUi(this);
    // 设置标题
    this->setWindowTitle("我的记事本");

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

    // 创建菜单
    QMenu* menu = new QMenu("文件");
    menuBar->addMenu(menu);

    // 创建菜单项
    QAction* action1 = new QAction("保存");
    QAction* action2 = new QAction("加载");
    menu->addAction(action1);
    menu->addAction(action2);

    // 创建中央控件
    edit = new QTextEdit(this);
    this->setCentralWidget(edit);
    edit->setPlaceholderText("此处编写文本内容...");

    connect(action1, &QAction::triggered, this, &MainWindow::save);
    connect(action2, &QAction::triggered, this, &MainWindow::load);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::save() {
    QFileDialog* dialog = new QFileDialog(this);
    QString fileName = dialog->getSaveFileName(this, "保存文件","C:/User/1/");
    qDebug() << "file name" <<  fileName;

    std::ofstream file(fileName.toStdString().c_str());
    if (!file.is_open()) {
        qDebug() << "save file";
        return;
    }
    const QString& text = edit->toPlainText();
    file << text.toStdString();
    file.close();
}

void MainWindow::load() {
    QFileDialog* dialog = new QFileDialog(this);
    QString fileName = dialog->getOpenFileName(this, "load file", "C:/Users/1/");
    qDebug() << "fileName: " << fileName;

    // 读取⽂件
    std::ifstream file(fileName.toStdString().c_str());
    if (!file.is_open()) {
    qDebug() << "⽂件加载失败!";
    return;
    }
    std::string content;
    std::string line;
    while (std::getline(file, line)) {
    content += line;
    content += "\n";
    }
    file.close();

    // 显⽰到界⾯上
    QString text = QString::fromStdString(content);
    edit->setPlainText(text);

}

执行程序就可以保存文件和加载文件了。

3. 工具栏(QToolBar)

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

3.1. 创建工具栏

调用QMainWindow类的addToolBoar()函数来创建工具栏,每增加一个工具栏都需要调用一次该函数。

    QToolBar* toolBar1 = new QToolBar(this);
    QToolBar* toolBar2 = new QToolBar(this);

    this->addToolBar(toolBar1);
    this->addToolBar(toolBar2);

3.2. 设置停靠位置

工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过QToolBar提供的setAllowedAreas()函数来设置。

3.2.1. 方式一

创建工具栏的同时指定停靠的位置。

在创建工具栏的同时,也可以设置工具栏的位置,其默认位置是在窗口的最上面;如上述代码,默认在最上面显示。工具栏允许停靠的区域由QToolBar类提供的allowAreas()函数决定,其中可以设置的位置包括

Qt::LeftToolBarArea

停靠在左侧

Qt::RightToolBarArea

停靠在右侧

Qt::TopToolBarArea

停靠在顶部

Qt::BottomToolBarArea

停靠在底部

Qt::AllToolToolBarArea

以上四个位置都可以停靠

    QToolBar* toolBar1 = new QToolBar(this);
    QToolBar* toolBar2 = new QToolBar(this);



    this->addToolBar(Qt::LeftToolBarArea,toolBar1);
    this->addToolBar(Qt::RightToolBarArea,toolBar2);

3.2.2. 方式二

使用QToolBar类提供的setAllowedAreas()函数设置停靠位置

    this->addToolBar(toolBar1);
    this->addToolBar(toolBar2);
    
    toolBar1->setAllowedAreas(Qt::LeftToolBarArea);
    toolBar2->setAllowedAreas(Qt::RightToolBarArea);

说明:
在创建⼯具栏的同时指定其停靠的位置,指的是程序运⾏时⼯具栏默认所在的位置;⽽使⽤
setAllowedAreas()函数设置停靠位置,指的是⼯具栏允许其所能停靠的位置。

3.3. 设置浮动属性

⼯具栏的浮动属性可以通过 QToolBar类 提供的setFloatable()函数来设置。setFloatable()函数原型为:
void setFloatable(boolfloatable)
参数:true:浮动
false:不浮动

    this->addToolBar(Qt::LeftToolBarArea, toolBar1);
    this->addToolBar(Qt::RightToolBarArea,toolBar2);

    toolBar1->setFloatable(true);
    toolBar2->setFloatable(false);

3.4. 设置移动属性

设置⼯具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置。setMovable()函数
原型为:
void setMovable(boolmovable)
参数:true:移动
false:不移动

说明:若设置⼯具栏为不移动状态,则设置其停靠位置的操作就不会⽣效,所以设置⼯具栏
的移动属性类似于总开关的效果


    QToolBar* toolBar1 = new QToolBar(this);
    QToolBar* toolBar2 = new QToolBar(this);



    this->addToolBar(Qt::LeftToolBarArea, toolBar1);
    this->addToolBar(Qt::RightToolBarArea,toolBar2);

//    toolBar1->setAllowedAreas();
//    toolBar2->setAllowedAreas();

    toolBar1->setMovable(true);
    toolBar2->setMovable(false);

4. 状态栏(QStatusBar)

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

  1. 实时消息:如当前程序状态
  2. 永久消息:如程序版本号,机构名称
  3. 进度消息:如进度条提示,百分百提示

4.1. 状态栏的创建

状态栏的创建是通过QMainWindow类提供的statusBar()函数来创建的。

4.2. 在状态栏中显示实时消息

在状态栏中显示实时消息是通过showMessage()函数来实现的,

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


    ui->setupUi(this);

    QStatusBar *status = this->statusBar();
    setStatusBar(status);

    QLabel *label = new QLabel("提示信息", this);

    status->addWidget(label);

}


调整显示消息的位置

    QLabel *label2 = new QLabel("右侧提示信息", this);
    status->addPermanentWidget(label2);

5. 浮动窗口(QDocWidget)

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

5.1. 浮动窗口的创建

浮动窗口的创建是通过QDockWidget类提供的构造方法QDockWidget()函数动态创建的;

    // 浮动窗口
    QDockWidget* dockwidget = new QDockWidget("浮动窗口", this);

    // 将浮动窗口置于当前窗口中
    addDockWidget(Qt::BottomDockWidgetArea, dockwidget);


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


    ui->setupUi(this);

    // 浮动窗口
    QDockWidget* dockwidget = new QDockWidget("浮动窗口", this);

    // 将浮动窗口置于当前窗口中
    addDockWidget(Qt::BottomDockWidgetArea, dockwidget);

    // 浮动窗口也是可以设置标题的
    dockwidget->setWindowTitle("这是浮动窗口");

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

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

    // 创建其他控件添加到layout中
    QLabel* label = new QLabel("这是一个QLabel");
    QPushButton* btn = new QPushButton("这是按钮");
    layout->addWidget(label);
    layout->addWidget(btn);
}

5.2. 设置停靠的位置

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

Qt::LeftDockWidgetArea --- 停靠在左侧
Qt::RightDockWidgetArea --- 停靠在右侧
Qt::TopDockWidgetArea --- 停靠在顶部
Qt::BottomDockWidgetArea --- 停靠在底部
Qt::AllkWidgetArea --- 四个位置都可以停靠

6. 对话框(QFiledialog,QColorDialog,QFontDialog,QInputDialog,QMessageBox)

对话框是GUI程序中不可缺少的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog(文件对话框),QColorDialog(颜色对话框),QFontDialog(字体对话框),QInputDialog(输入对话框),QMessageBox(消息框);

6.1. 模态对话框

模态对话框是指:显示后无法与父窗口进行交互,是一种阻塞式的对话框。使用QDialog::exec()函数调用。

模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。

6.1.1. 示例1:创建对话框

要想自定义对话框,就需要继承自QDialog创建类(对话框的内存泄漏问题)

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton(this);
    btn->setText("点击创建对话框");

    connect(btn,&QPushButton::clicked, this, &MainWindow::push_btn);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::push_btn() {
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("对话框标题");

    // 设置对话框的尺寸
    dialog->resize(400, 300);

    dialog->exec();
}

6.2. 非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用QDialog::show()函数调用。

非模态对话框一般在堆上创建,这是因为如果创建在栈上时,弹出的非模态对话框就会一闪而过。同时还需要设置Qt::WA_DeleteOnClose属性,目的是:当创建多个非模态对话框时,为了避免内存泄漏要设置此属性。

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。

6.2.1. 示例1:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QTextEdit>
#include <QFileDialog>
#include <QDebug>
#include <fstream>
#include <QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDialog>

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton(this);
    btn->setText("点击创建对话框");

    connect(btn,&QPushButton::clicked, this, &MainWindow::push_btn);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::push_btn() {
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("对话框标题");

    // 设置对话框的尺寸
    dialog->resize(400, 300);

    // 通过show党法就可以显示出来对话框
    dialog->show();


    /*
        每次点击都会创建出来一个新的对话框对象,这也就意味着多次点击会产生多个对象,进一步就会产生无数个这样的
        对象了。这就会产生内存泄漏。
        虽然吧QDialog的父元素设为this了,在进程退出的时候,会由对象树来释放整个对象,但是如果此时在窗口中
        点击的多了,(你的机器剩的内存不多了,或者是嵌入式)这就不行了。需要我们手动的把点开的dialog对象给释放了。
    */

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

6.3. 消息对话框(QMessageBox)

消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

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

Question

⽤于正常操作过程中的提问

Information

⽤于报告正常运⾏信息

Warning

⽤于报告⾮关键错误

Critical

⽤于报告严重错误

6.3.1. 示例1:问题提示消息对话框

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton("消息对话框", this);
    QMessageBox* msg = new QMessageBox(this);

    msg->setWindowTitle("Warning Message"); // 设置消息对话框的标题
    msg->setText("Error Message!"); // 设置消息对话框的内容
    msg->setIcon(QMessageBox::Question); // 设置消息对话框的类型
    msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); // 在消息对话框上设置按钮

    connect(btn, &QPushButton::clicked, [=]() {
        msg->show();
    });
}

其中可以设置的按钮的类型如下

6.4. 颜色对话框(QColorDialog)

颜色对话框的功能是允许用户选择颜色。继承自QDialog类。

常用方法介绍

QColorDialog(QWidget* parent = nullptr)

创建对象的同时设置父对象

QColorDialog(const QColor &initial, QWidget *parent = nullptr)

创建对象的同时通过QColor对象设置默认颜⾊和⽗对象

void setCurrentColor(const QColor &color)

设置当前颜⾊对话框

QColor currentColor() const

获取当前颜⾊对话框

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

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

打开颜⾊选择对话框,并返回⼀个QColor对象

void open(QObject *receiver, const char *member)

打开颜⾊对话框

6.4.1. 示例1:

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton("颜色对话框", this);

    QColorDialog* dialog = new QColorDialog(this);

    connect(btn, &QPushButton::clicked, [=] {
        QColor color = dialog->getColor(QColor(255, 0, 0));
        qDebug() << color;
    });
}

6.5. 文件对话框(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 默认打开的路径
参数4:filter ⽂件过滤器

6.5.1. 示例1:打开文件

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton("文件", this);

    QFileDialog* file = new QFileDialog(this);

    connect(btn, &QPushButton::clicked, [=] {
        QString str = file->getOpenFileName(this,
                                            "file",
                                            "C:\\Users\\Lenovo\\Desktop\\2024-03-26"
                                            );
    });
}

6.6. 字体对话框(QFontDialog)

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

6.6.1. 示例1:

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton("文件", this);



    connect(btn, &QPushButton::clicked, [=] {
        bool flag;
        QFont font = QFontDialog::getFont(&flag, QFont("华文行楷", 36));

        // 将char* 转换为QString 的方法, toUtf8().data();
        qDebug() << "字体:"  << font.family().toUtf8().data();

        // pointSize() 获取字号
        qDebug() << "字号:" << font.pointSize();

        // bold() --- 判断字体是否加粗
        qDebug() << "是否加粗:" << font.bold();

        // italic() ---- 判断字体是否倾斜
        qDebug() << "是否倾斜:" << font.italic();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

6.7. 输入对话框(QInputDialog)

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

双精度浮点型输⼊数据对话框

double 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());

整型输⼊数据对话框

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

选择条⽬型输⼊数据框

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:可供选择的条⽬

6.7.1. 示例1:浮点型数据输入对话框

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


    ui->setupUi(this);
    QPushButton* btn = new QPushButton("输入框", this);
    QInputDialog* input = new QInputDialog(this);


    connect(btn, &QPushButton::clicked, [=] {
        double d = input->getDouble(this, "输入框", "浮点型");
        qDebug() << d;
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

7. 小结

  1. 菜单栏(QMenuBar)=>菜单(QMenu)=>菜单项(QAciton)
  2. 工具栏(QToolBar)(具有多个)=>菜单项(QAction)
  3. 子窗口(QDockWidget)=>QWidget=>放置其他的控件
  4. 状态栏(QStatusBar)=>QWidget
  5. 对话框(QDialog)=>自己手动继承的方式,针对QDialog进行扩展

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

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

相关文章

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统&#xff0c;目前已在多家三级级医院应用&#xff0c;并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

2024-4-22 群讨论:微服务启动预热相关

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信进群拉你 Hotspot JVM 进程启动后&#xff0c;流量到来的时候 JIT 吃掉很多 CPU&#xff0c;如何观察到&#xff1f; 很多途径都能观察到&#xff1a; top -Hp&#xff1a;这个需…

前端开发攻略---封装日历calendar组件(纯手搓),可以根据您的需求任意改变,可玩性强

1、演示 2、代码 <template><div class"box" v-if"startMonth.year"><div class"left"><div class"top"><span class"iconfont" click"changeMonth(-1)">左</span><span&…

JTAG访问xilinx FPGA的IDCODE

之前调试过xilinx的XVC&#xff08;Xilinx virtual cable&#xff09;&#xff0c;突然看到有人搞wifi-JTAG&#xff08;感兴趣可以参考https://github.com/kholia/xvc-esp8266&#xff09;&#xff0c;也挺有趣的。就突然想了解一下JTAG是如何运作的&#xff0c;例如器件识别&…

关于开设RT-DETR专栏及更新内容的一些说明

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

jsp实验10 JavaBean

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握javabean的用法。【参考课本 上机实验 5.5.1 】 三、源代码以及执行结果截图&#xff1a; 源代码&#xff1a; Fraction.java package sea.water; public class Fraction { public double numbe…

【北京迅为】《iTOP-3588开发板系统编程手册》-第19章 V4L2摄像头应用编程

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

Skill Check: Build an LLM Application using OCI Generative AI Service

Skill Check: Build an LLM Application using OCI Generative AI Service

数据清洗:异常值检测方法

异常值检测方法总结 一、基于分布1、3σ原则2、Z_score方法3、boxplot一、基于分布 1、3σ原则 3σ原则又称为拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常…

贪心算法练习day.1

理论基础 贪心算法是一种常见的解决优化问题的方法&#xff0c;其基本思想就是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部的最优决策&#xff0c;以此得到全局的最优解&#xff0c;例如在十张面额不同的钞票&#xff0c;让我们…

ctfshow 每周大挑战RCE极限挑战

讨厌SQl看到这个了想来玩玩 rce1 <?phperror_reporting(0); highlight_file(__FILE__);$code $_POST[code];$code str_replace("(","括号",$code);$code str_replace(".","点",$code);eval($code);?>括号过滤点过滤&…

查找算法之分块查找

目录 前言一、查找算法预备知识二、分块查找三、总结3.1 查找性能3.2 适用场景3.3 优缺点 前言 查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中&#xff0c;查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。…

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

家用洗地机哪款好用?盘点618值得买的洗地机品牌

对于工作忙碌或家里养了宠物的很多朋友来说&#xff0c;洗地机它集合吸尘清扫湿拖的功能&#xff0c;很大程度上解放了家庭清洁劳动的繁琐&#xff0c;让人们腾出更多的时间休息&#xff0c;那么&#xff0c;市场上有很多牌子的洗地机&#xff0c;价格也各不相同&#xff0c;那…

HarmonyOS应用性能分析工具CPU Profiler的使用指南

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法&#xff0c;该工具为开发者提供性能采样分析手段&#xff0c;可在不插桩情况下获取调用栈上各层函数的执行时间&#xff0c;并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

前言 泛型是一种编程概念&#xff0c;它允许我们编写可以适用于多种数据类型的代码。通过使用泛型&#xff0c;我们可以在编译时期将具体的数据类型作为参数传递给代码&#xff0c;从而实现代码的复用和灵活性。 在传统的编程中&#xff0c;我们通常需要为不同的数据类型编写不…

web项目运行时,报了500错误(HTTP Status 500 – Internal Server Error)

web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09; 文章目录 web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09;前言一、 解决方法&#xff1a;Project Structure…

视频监控/视频集中存储/云存储EasyCVR视频汇聚平台如何切换主子码流?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

赛氪网凭借教育人优势,荣获中关村高新技术企业协会会员单位称号

2023年&#xff0c;中关村科技园区管理委员会正式公布了一批新的高新技术企业协会会员单位名单&#xff0c;赛氪网荣幸成为其中一员。这一荣誉的获得&#xff0c;不仅是对赛氪网在竞赛、科技创新教育领域的充分肯定&#xff0c;也标志着赛氪网在推动高新技术发展方面迈出了坚实…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…