Qt - 窗口

目录

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进行扩展

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端】input输入框输入文字加文字轮廓效果

【前端】input输入框输入文字加文字轮廓效果 两种方案 方案一 输入框文字轮廓DEMO1通过文字阴影实现 <!DOCTYPE html> <html lang"en"> <head><title>输入框文字轮廓DEMO1通过文字阴影实现</title> <meta charset"UTF-8&quo…

【Linux进阶之路】高级IO

一、 铺垫 I&#xff0c;即input为输入&#xff1b;O&#xff0c;即output为输出&#xff0c;IO&#xff0c;即input output为输入输出。IO一般是基于网卡&#xff0c;磁盘&#xff0c;光盘&#xff0c;U盘&#xff0c;磁盘&#xff0c;磁带等毫秒级别的外存&#xff0c;相较…

《QT实用小工具·三十一》基于QT开发的访客管理平台demo2

1、概述 源码放在文章末尾 该项目为访客管理平台demo&#xff0c;包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain…

SpringBoot + Redis实现用户信息登录的缓存

&#x1f34e;前言 &#x1f350;项目的背景 背景&#xff1a;&#x1f349;当我们在完成用户信息登录时&#xff0c;我们往往每次都会在数据库中查询用户的记录&#xff0c;生成token并返回给前端&#xff0c;不过这样会有一定的问题。 &#x1f350;造成的问题 问题&#xf…

Linux 用户和组

理解Linux 用户和组的概念 掌握passwd 文件的组成以及作用 掌握shadow 文件的组成以及作用 了解group 文件的内容 1.用户分类&#xff1a; 超级管理员&#xff08;root&#xff09; 普通用户 程序用户 1.用户信息文件 /etc/passwd 文件中存储了所有用户信息。 1.passwd 格…

python中中英文打印对齐解决方案

在python中&#xff0c;有时候会出现中英文混合输出的情形&#xff0c;但是由于中文默认是全角格式&#xff08;一个中文字符占用两个字符宽度&#xff09;&#xff0c;这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候&#xff0c;这种差异会导致文…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter&#xff0c;LRO)…

文心一言 VS 讯飞星火 VS chatgpt (240)-- 算法导论17.3 6题

六、证明&#xff1a;如何用两个普通的栈实现一个队列(练习10.1-6)&#xff0c;使得每个 ENQUEUE 和 DEQUEUE 操作的摊还代价为 O(1) 。练习10.1-6的内容是&#xff1a;说明如何用两个栈实现一个队列&#xff0c;并分析相关队列操作的运行时间。如果要写代码&#xff0c;请用go…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

el-table使用show-summary合计,但只需要合并某一列

el-table使用show-summary合计&#xff0c;但只需要合并某一列 这里有两种方法&#xff0c;一种是网上的&#xff0c;我会引用他的链接给你们看。 一种是我自己看源码发现的 方法一 这个就是方法一的链接 点击我跳转方法一 方法二 不需要计算的列 去掉prop 然后用插槽显示即可…

比特币叙事大转向

作者&#xff1a;David Lawant 编译&#xff1a;秦晋 要理比特币解减半动态&#xff0c;最关键的图表是下面这张&#xff0c;而不是价格图表。它显示了自 2012 年以来&#xff0c;矿业总收入与比特币现货交易量的比例&#xff0c;并标注了三个减半日期。 虽然矿工仍然是比特币生…

Python八股文:基础知识Part2

1. Python中变量的保存和访问 Python中的变量实际上是一个指向对象的引用&#xff0c;每个对象都有一个唯一的标识符&#xff08;即内存地址&#xff09;。对于一些不可变对象&#xff0c;如字符串和整数&#xff0c;因为它们的值不可更改&#xff0c;所以当多个变量引用相同的…

OSPF大型实验

OSPF大型实验 实验拓扑图 实验思路 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架&#xff08;Java Collections Framework&#xff09;是一个强大的、高度灵活的数据结构库&#xff0c;它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类&#xff1a; Collection: 是单例集合类的顶层接口&#xff0c;包括Lis…

移动端适配之viewport

目录 盒模型&#xff1a;widthcontent&#xff08;padding border&#xff09; class"content-box"内容盒模型&#xff08;W3C盒&#xff09; class"border-box"边框盒模型&#xff08;IE 盒&#xff09; scroll滚动 window浏览器视窗&#xff1a;包括…

MySQL高级(索引-性能分析-explain执行计划)

explain 或者 desc 命令获取 MySQL 如何执行 select 语句的信息&#xff0c;包括在 select 语句执行过程中表如何连接和连接的顺序。 -- 直接在 select 语句之前加上关键字 explain / desc explain select 字段列表 from 表名 where 条件 &#xff1b; explain select * …

自养号测评:如何提高国际站,敦煌网的店铺销量?

随着互联网技术的迅猛进步&#xff0c;电子商务已经成为现代商业领域中不可或缺的一环。敦煌网&#xff0c;作为专注于中国文化艺术产品的电商平台&#xff0c;成功吸引了大量消费者的目光。然而&#xff0c;对于商家而言&#xff0c;如何进一步提升敦煌网的销售业绩&#xff0…

用这些工具搭建企业内部知识库,原来这么轻松

在快速发展和信息爆炸的时代&#xff0c;为企业构建一个内部知识库变得十分重要。它不仅有助于保存关键信息&#xff0c;促进知识传承&#xff0c;还能提高企业的整体效率和响应能力。今天&#xff0c;我们将探讨三款非常适合搭建企业内部知识库的工具&#xff0c;它们各具特色…

Python教学入门:流程控制

条件语句&#xff08;if 语句&#xff09;&#xff1a; 条件语句用于根据条件的真假执行不同的代码块。 x 10if x > 0: # 如果 x 大于 0print("x 是正数") # 输出&#xff1a;x 是正数 elif x 0: # 如果 x 等于 0print("x 是零") else: # 如果以…