【QT】Qt窗口

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:QT

在这里插入图片描述


目录

  • 👉🏻菜单栏设置
  • 👉🏻QToolBar
    • 练习
  • 👉🏻QStausBar
  • 👉🏻QDockWidget
  • 👉🏻QDialog
    • 自定义对话框
    • ui设置Dialog
    • 模态对话框和非模态对话框
  • 👉🏻QMessageBox
  • 👉🏻QColorDialog
  • 👉🏻QFileDialog
  • 👉🏻QFontDialog
  • 👉🏻QInputDialog

👉🏻菜单栏设置

Qt 的菜单栏(MenuBar)是 GUI 应用中常见的界面元素之一,用于组织应用中的命令和选项。菜单栏通常位于窗口的顶部,包含多个菜单项(Menu),每个菜单项又可以包含多个子菜单项或动作(Action)。用户可以通过点击菜单项来执行相应的命令或访问其他界面元素。

菜单栏的UI设置

在Qt中,你可以通过两种方式设置菜单栏:使用Qt Designer进行图形化设计,或者通过编写代码直接创建。

使用Qt Designer

  1. 打开Qt Designer:启动Qt Designer,并打开你的.ui文件或创建一个新的窗口。
  2. 添加菜单栏:在左侧的Widget Box中找到MenuBar(在某些Qt版本中可能直接作为窗口的一部分存在,无需单独添加)。将其拖拽到主窗口的顶部或适当位置。
  3. 添加菜单和动作:右键点击MenuBar,选择“Add Menu”来添加一个新的菜单项。给菜单项命名,比如“文件”、“编辑”等。然后,你可以右键点击菜单项,选择“Add Action”来添加动作(即具体的命令或选项)。
  4. 配置动作属性:选中动作后,在右侧的属性编辑器中设置其属性,如text(显示文本)、shortcut(快捷键)、statusTip(状态栏提示)等。

通过代码创建

如果你偏好编程方式,可以通过Qt的C++ API来创建菜单栏、菜单和动作。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1.创建一个菜单栏//QMenuBar* menubar = new QMenuBar();QMenuBar* menubar = this->menuBar();//这样防止内存泄漏,使用Qt已经给我们创建好的ui中的menubarthis->setMenuBar(menubar);//2.创建菜单QMenu* menu1 = new QMenu("文件(&F)");//&F相当于alt+F快捷键menubar->addMenu(menu1);//3.给菜单添加菜单项QAction* action1 = new QAction("新建(&Q)");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("保存");QAction* action4 = new QAction("另存为");menu1->addAction(action1);menu1->addAction(action2);menu1->addSeparator();//添加分割线menu1->addAction(action3);menu1->addAction(action4);//4.给action添加信号槽connect(action1,&QAction::triggered,this,&MainWindow::handle);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle()
{qDebug()<<"dasd";
}

注意:在上面的代码示例中,对于QWidget,我们尝试手动创建并设置菜单栏,但实际上QWidget并没有提供直接设置菜单栏的接口。这个例子主要是为了展示如何创建菜单栏、菜单和动作。对于QMainWindow,你应该直接使用其menuBar()成员函数来获取现有的菜单栏,并向其中添加菜单和动作。

👉🏻QToolBar

QToolBar是Qt框架中用于创建和管理工具栏的一个类,它提供了丰富的接口和功能,允许开发者定制工具栏的外观和行为。以下是对QToolBar基本使用的介绍:

1. 创建QToolBar

在Qt中,你可以通过QToolBar的构造函数来创建一个工具栏。通常,这个构造函数会接受一个标题字符串和一个父窗口指针作为参数。例如:

QToolBar* toolbar = new QToolBar("MyToolbar", this);

这里,"MyToolbar"是工具栏的标题,this是指向当前窗口(通常是QMainWindowQWidget的子类)的指针,表示工具栏的父窗口。

2. 添加动作(QAction)

工具栏的主要功能是展示一系列的动作(QAction),这些动作可以是按钮、菜单项或其他可交互的UI元素。你可以通过addAction方法向工具栏中添加动作,并可以指定动作的图标和文本。例如:

QAction* actionOpen = toolbar->addAction(QIcon(":/images/open.png"), "Open");
connect(actionOpen, &QAction::triggered, this, &MyClass::openFile);

这里,addAction方法接受一个QIcon对象和一个字符串作为参数,分别代表动作的图标和文本。然后,你可以通过信号和槽机制将动作的触发信号连接到相应的槽函数上,以处理用户的点击事件。

3. 添加分隔符

为了更好地组织工具栏上的动作,你可以在动作之间添加分隔符。这可以通过调用addSeparator方法实现:

toolbar->addSeparator();

分隔符会创建一个可视化的边界,将工具栏上的动作分组。

4. 设置工具栏属性

QToolBar提供了多个接口来设置工具栏的属性,以满足不同的需求。以下是一些常用的属性设置方法:

  • setMovable(bool movable):设置工具栏是否可以移动。
  • setIconSize(const QSize &iconSize):设置工具栏中图标的大小。
  • setToolButtonStyle(Qt::ToolButtonStyle style):设置工具栏中工具按钮的样式。
  • setOrientation(Qt::Orientation orientation):设置工具栏的方向(水平或垂直)。

5. 添加自定义部件

除了添加标准的QAction之外,你还可以将自定义的QWidget部件添加到工具栏中。这可以通过addWidget方法实现:

QWidget* customWidget = new QWidget;
// 配置customWidget...
toolbar->addWidget(customWidget);

自定义部件可以是任何QWidget的子类,提供了将非标准UI元素集成到工具栏中的灵活性。

6. 添加到主窗口

最后,你需要将创建好的工具栏添加到主窗口(如QMainWindow)中。这可以通过调用addToolBar方法实现:

this->addToolBar(toolbar);

或者,如果你想要指定工具栏的停靠区域,可以使用addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)的重载版本。

总结

QToolBar是Qt中用于创建和管理工具栏的重要类,它提供了丰富的接口和功能,允许开发者创建功能丰富且用户友好的工具栏。通过添加动作、分隔符和自定义部件,并设置适当的属性,你可以轻松地定制工具栏的外观和行为,以满足应用程序的需求。

练习

 QToolBar* toolbar = new QToolBar();//工具栏要自己创建this->addToolBar(toolbar);QAction* action1 = new QAction("文件");QAction* action2 = new QAction("编辑");action1->setIcon(QIcon(":/openDir.png"));//设置图标action1->setToolTip("点击保存文件");toolbar->addAction(action1);toolbar->addAction(action2);

👉🏻QStausBar

QStatusBar(状态栏)是Qt框架中用于显示状态信息和消息的一个重要控件,它通常位于主窗口(如QMainWindow)的底部,用于向用户展示各种状态信息、临时通知或持久消息。以下是QStatusBar的基本使用方法:

1. 初始化与设置

  • 创建QStatusBar实例:在QMainWindow中,通常不需要手动创建QStatusBar实例,因为QMainWindow已经内置了一个状态栏。但如果你需要在其他类型的QWidget中添加状态栏,可以手动创建QStatusBar的实例并将其添加到布局中。
  • 设置状态栏:在QMainWindow中,可以通过statusBar()方法获取内置的状态栏,并通过返回的QStatusBar对象进行操作。如果是手动创建的QStatusBar,则直接通过其提供的接口进行设置。

2. 显示消息

  • 临时消息:使用showMessage()方法可以在状态栏中显示一条临时消息,并指定显示时间(以毫秒为单位)。如果未指定时间,则消息将一直显示直到被其他消息覆盖或调用clearMessage()方法清除。
  • 永久消息:虽然QStatusBar本身不提供直接设置永久消息的API,但可以通过addWidget()addPermanentWidget()方法向状态栏中添加永久显示的控件(如QLabel),以此来显示持久消息。

3. 添加控件

  • 添加普通控件addWidget()方法允许向状态栏中添加任何QWidget派生的控件,这些控件将按照添加顺序显示在状态栏中。
  • 添加永久控件addPermanentWidget()方法与addWidget()类似,但它添加的控件将始终显示在状态栏的末端,不会被临时消息覆盖。

4. 样式与布局

  • 样式设置:QStatusBar的样式可以通过Qt样式表(QSS)进行定制,包括背景色、字体、边框等。这允许开发者根据应用的整体风格调整状态栏的外观。
  • 布局管理:虽然QStatusBar本身管理其内部控件的布局,但开发者可以通过添加控件和调整它们的大小来间接影响状态栏的布局。

5. 清除与更新

  • 清除消息:使用clearMessage()方法可以清除当前显示的临时消息。
  • 更新控件:对于添加到状态栏中的永久控件,可以直接调用这些控件的更新方法来更新它们显示的内容。

6.代码示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QStatusBar>
#include<QLabel>
#include<QProgressBar>
#include<QPushButton>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* statusbar = this->statusBar();//显示一个临时消息// statusbar->showMessage("李女士",3000);//添加子控件QLabel* label = new QLabel("控件1");statusbar->addWidget(label);QProgressBar* progressbar = new QProgressBar();progressbar->setRange(0,100);progressbar->setValue(50);statusbar->addWidget(progressbar);QPushButton* button = new QPushButton("按钮");statusbar->addPermanentWidget(button);
}MainWindow::~MainWindow()
{delete ui;
}

在这里插入图片描述

👉🏻QDockWidget

QDockWidget是Qt框架中一个非常实用的类,它允许开发者创建可停靠、可浮动的侧边栏或面板,为用户提供灵活的界面布局选项。这些侧边栏通常包含工具栏、属性编辑器或其他辅助控件,能够极大地提升应用程序的用户体验和功能性。以下是QDockWidget的基本使用方法:

  1. 创建QDockWidget实例

首先,需要创建QDockWidget的实例,并为其设置标题。QDockWidget的构造函数允许你指定标题、父部件(通常是QMainWindow)以及窗口标志。

QDockWidget *dockWidget = new QDockWidget("Dock Widget Title", &mainWindow);
  1. 设置内容

QDockWidget的内容是通过调用setWidget()方法设置的,该方法接受一个QWidget或其子类的实例作为参数。这个QWidget将作为QDockWidget的子部件显示。

QTextEdit *textEdit = new QTextEdit;
textEdit->setText("This is a QTextEdit inside a QDockWidget.");
dockWidget->setWidget(textEdit);
  1. 添加到QMainWindow

使用QMainWindow的addDockWidget()方法将QDockWidget添加到指定的位置。该方法接受两个参数:停靠位置QDockWidget对象

mainWindow.addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
  1. 设置停靠属性

QDockWidget提供了多种方法来设置其停靠属性,包括允许停靠的区域、是否可浮动、是否可移动等。

  • 设置允许停靠的区域:使用setAllowedAreas()方法,可以指定QDockWidget可以停靠的区域(顶部、底部、左侧、右侧或全部)。
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  • 设置是否可浮动:通过setFloating()方法,可以控制QDockWidget是否可以被浮动(即脱离主窗口成为独立窗口)。
dockWidget->setFloating(false); // 设置为不可浮动
  • 设置功能标志setFeatures()方法允许你设置QDockWidget的功能标志,如是否显示关闭按钮、是否可移动等。
dockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
  1. 停靠与浮动

用户可以通过拖动QDockWidget的标题栏来改变其停靠位置或切换到浮动窗口状态。开发者也可以通过编程方式控制这些行为。

  1. 信号与槽

QDockWidget提供了多种信号,如topLevelChanged()(当浮动状态变化时发出)、visibilityChanged()(当显示状态变化时发出)等。开发者可以连接这些信号到自定义的槽函数,以响应QDockWidget的状态变化。

  1. 保存与恢复布局

Qt提供了一种机制,允许开发者保存当前的QMainWindow及其包含的QDockWidget布局信息,并在后续运行时恢复这些布局。这通常通过调用QMainWindow的saveState()restoreState()函数实现。

  1. 自定义样式

QDockWidget的标题栏和按钮的视觉外观可以通过样式表(QSS)进行自定义,以满足应用程序的整体风格需求。

9.代码示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QStatusBar>
#include<QLabel>
#include<QProgressBar>
#include<QPushButton>
#include<QDockWidget>
#include<QVBoxLayout>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* statusbar = this->statusBar();QDockWidget* dockwidget = new QDockWidget();this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);dockwidget->setWindowTitle("子窗口");//给浮动窗口添加子控件,不能直接添加,要先添加到QWidget控件中//然后再将QWidget添加到浮动窗口中才行QWidget* container = new QWidget();dockwidget->setWidget(container);//创建布局和添加子控件QVBoxLayout* layout = new QVBoxLayout();QLabel* label = new QLabel("这是一个小标签");QPushButton* button = new QPushButton("按钮");layout->addWidget(label);layout->addWidget(button);container->setLayout(layout);}MainWindow::~MainWindow()
{delete ui;
}

在这里插入图片描述

👉🏻QDialog

QDialog 是 Qt 框架中用于创建对话框的基类,它继承自 QWidget 并提供了许多用于对话框管理的常用方法。
在这里插入图片描述
以下是一些 QDialog 的常用方法介绍:

  1. exec()

    • 这是模态对话框最常用的方法。当调用此方法时,会启动对话框的事件循环,并阻塞其他窗口的交互,直到对话框被关闭。exec() 方法返回一个整数,通常用于表示对话框的退出状态(比如,通过 QDialog::AcceptedQDialog::Rejected)。
  2. show()

    • 此方法用于以非模态方式显示对话框。调用 show() 后,对话框将立即显示,但用户仍然可以与应用程序中的其他窗口交互。
  3. close()

    • 关闭对话框。此方法可以由用户通过点击关闭按钮或调用代码中的 close() 方法来触发。在调用 close() 之前,通常会检查是否需要保存更改或执行其他清理操作。
  4. accept()

    • 通常用于表示用户接受了对话框中的选项或输入,并希望关闭对话框。accept() 方法会触发 accepted() 信号,并调用 done(Accepted) 来关闭对话框。
  5. reject()

    • 类似于 accept(),但表示用户拒绝了对话框中的选项或取消了操作。reject() 方法会触发 rejected() 信号,并调用 done(Rejected) 来关闭对话框。
  6. done(int r)

    • 这是一个更通用的方法来关闭对话框。参数 r 指定了对话框的退出状态(或称为结果码)。通过调用 done(),你可以自定义对话框的退出状态,而不仅仅是接受或拒绝。
  7. result()

    • 返回对话框的退出状态(即 done() 方法被调用时传递的值)。这通常用于在对话框关闭后检查用户的决定。
  8. setModal(bool modal)

    • 允许你在对话框显示后更改其模态性。如果 modaltrue,则对话框变为模态;如果为 false,则变为非模态。但是,请注意,在对话框显示后更改其模态性可能不会产生预期的效果,特别是如果对话框已经是模态的。
  9. setWindowModality(Qt::WindowModality windowModality)

    • 提供了一种更精细的控制对话框模态性的方式。Qt::WindowModality 是一个枚举类型,允许你指定对话框应该阻止哪些窗口的交互。例如,Qt::ApplicationModal 会阻止应用程序中所有其他窗口的交互,而 Qt::WindowModal 则只会阻止与特定窗口相关的交互。
  10. setAttribute(Qt::WidgetAttribute attribute, bool on = true)

    • 允许你设置对话框的各种窗口属性。Qt::WidgetAttribute 是一个枚举类型,包含了许多可用于控制窗口行为的属性。例如,你可以使用 Qt::WA_DeleteOnClose 属性来确保当对话框关闭时自动删除其对象。
  11. setFixedSize(const QSize &size)

    • 设置对话框的固定大小,使其无法由用户调整。
  12. setMinimumSize(const QSize &minSize)setMaximumSize(const QSize &maxSize)

    • 允许你设置对话框的最小和最大尺寸,以限制用户能够调整的大小范围。

代码示例:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include<QDialog>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* statusbar = this->statusBar();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QDialog* dialog = new QDialog(this);dialog->setWindowTitle("弹窗1");dialog->show();dialog->setAttribute(Qt::WA_DeleteOnClose);//来确保当对话框关闭时自动删除其对象,避免内存泄漏
}

自定义对话框

在这里插入图片描述
在这里插入图片描述

代码示例:
在这里插入图片描述
在这里插入图片描述
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QStatusBar>
#include<QLabel>
#include<QProgressBar>
#include<QPushButton>
#include<QDockWidget>
#include<QVBoxLayout>
#include<QDialog>
#include<dialog.h>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* statusbar = this->statusBar();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->setWindowTitle("弹窗1");dialog->resize(300,400);dialog->show();dialog->setAttribute(Qt::WA_DeleteOnClose);//来确保当对话框关闭时自动删除其对象,避免内存泄漏
}

在这里插入图片描述

ui设置Dialog

当然我们也不用麻烦去用代码设置Dialog.
我们可以事先创建好ui文件去设计Dialog
在这里插入图片描述
在这里插入图片描述

模态对话框和非模态对话框

模态对话框和非模态对话框是用户界面设计中常见的两种对话框类型,它们在用户交互方式、使用场景以及设计特点上有所不、区别与比较:

模态对话框非模态对话框
用户交互强制用户交互,必须处理完对话框中的操作才能继续其他操作非强制用户交互,用户可以在对话框打开时自由操作其他窗口
窗口阻塞阻塞其他窗口的交互,直到对话框关闭不阻塞其他窗口的交互,用户可同时进行多任务操作
使用场景适用于需要用户立即响应的场景,如数据验证、文件保存等适用于不需要用户立即响应的场景,如查找功能、信息提示等
设计考虑强调用户操作的顺序性和逻辑性,确保用户操作的正确性强调应用程序的灵活性和效率,避免打断用户的主要工作流程

在Qt中,设置模态对话框通常是在打开对话框时通过调用其exec()方法来实现的。当你调用一个对话框的exec()方法时,它会启动对话框的事件循环,并且会阻塞(或模态化)其他窗口的交互,直到用户关闭了该对话框。

void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->setWindowTitle("弹窗1");dialog->resize(300,400);//dialog->show();dialog->exec();//模态对话框dialog->setAttribute(Qt::WA_DeleteOnClose);//来确保当对话框关闭时自动删除其对象,避免内存泄漏
}

👉🏻QMessageBox

QMessageBox 是 Qt 框架中用于显示标准对话框的一个类,它允许开发者以简单的方式显示信息、警告、错误和询问用户等操作。QMessageBox 提供了丰富的配置选项,比如图标、文本、按钮等,以适应不同的使用场景。

以下是一些 QMessageBox 的基本用法介绍:

1. 包含头文件

首先,你需要在你的 Qt 项目的源文件中包含 QMessageBox 的头文件:

#include <QMessageBox>

2. 创建和显示消息框

QMessageBox 提供了多种静态函数来快速显示对话框,同时也支持实例化后自定义显示。

静态函数显示对话框

  • information():显示包含信息图标的消息框。
  • warning():显示包含警告图标的消息框。
  • critical():显示包含严重错误图标的消息框。
  • question():显示包含问号图标的消息框,通常用于询问用户。

例如,使用 information() 显示一个信息消息框:

QMessageBox::information(this, "标题", "这是一个信息消息框!");

这里,this 指的是父窗口(如果当前函数是某个窗口类的成员函数),"标题" 是消息框的标题,"这是一个信息消息框!" 是消息框中显示的文本。

实例化后自定义显示

你也可以创建一个 QMessageBox 的实例,并通过设置其属性来自定义对话框的显示。

QMessageBox msgBox;
msgBox.setWindowTitle("自定义标题");
msgBox.setText("这是一个自定义消息框!");
msgBox.setIcon(QMessageBox::Information); // 设置图标
msgBox.exec(); // 显示对话框,并阻塞直到用户关闭它

3. 添加按钮

QMessageBox 默认会根据你使用的静态函数(如 information(), warning(), critical(), question())来配置按钮。但如果你需要自定义按钮,可以通过实例化 QMessageBox 并使用其 addButton() 方法来实现。

QMessageBox msgBox;
msgBox.setWindowTitle("自定义按钮");
msgBox.setText("这是一个带有自定义按钮的消息框。");
QAbstractButton *okButton = msgBox.addButton("OK", QMessageBox::AcceptRole);
QAbstractButton *cancelButton = msgBox.addButton("Cancel", QMessageBox::RejectRole);if (msgBox.exec() == QMessageBox::AcceptedRole) {// 如果用户点击了OK按钮
} else {// 如果用户点击了Cancel按钮或关闭了对话框
}

注意,在上面的例子中,我们使用 exec() 方法的返回值来判断用户点击了哪个按钮,但实际上 exec() 返回的是一个整型值,它对应于被点击的按钮的 role 而不是按钮本身。为了判断具体的按钮,你可能需要遍历 msgBox.buttons() 并使用 QObject::sender() 或其他机制。但更常见的是,给按钮设置 role(如上例所示),并据此判断用户的操作。

代码练习示例:

QMessageBox* messagebox = new QMessageBox();messagebox->setWindowTitle("标题");messagebox->setText("警告警告!");messagebox->setIcon(QMessageBox::Warning);//警告标志messagebox->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);//显示messagebox->exec();

在这里插入图片描述
自定义按钮

 QPushButton* button = new QPushButton("确认",this);messagebox->addButton(button,QMessageBox::AcceptRole);

在这里插入图片描述

👉🏻QColorDialog

QColorDialog 是 Qt 框架中的一个类,用于提供一个对话框,允许用户选择一个颜色。这个对话框支持标准的颜色选择功能,包括颜色样本、自定义颜色选择以及通过颜色轮或颜色滑块来精确选择颜色。在开发基于 Qt 的 GUI 应用程序时,QColorDialog 是一个非常有用的工具,尤其是在需要用户从一组颜色中选择或定义特定颜色的场景中。

以下是 QColorDialog 的基本使用方法:

  1. 包含必要的头文件

首先,确保你的项目中包含了 QColorDialog 所需的头文件。

#include <QColorDialog>
  1. 调用 QColorDialog

你可以通过调用 QColorDialog 的静态方法 getColor() 来显示对话框并获取用户选择的颜色。这个方法有几个重载版本,允许你指定初始颜色、父窗口以及颜色选择模式等。

示例代码

#include <QColorDialog>
#include <QMessageBox>QColor initialColor = Qt::blue; // 初始颜色设置为蓝色
QColor selectedColor = QColorDialog::getColor(initialColor, this, "选择颜色");if (selectedColor.isValid()) {// 用户选择了颜色QMessageBox::information(this, "颜色选择", QString("您选择的颜色是: #%1").arg(selectedColor.name()));//设置背景颜色char style[1024] = {0};sprintf(style,"background-color:rgb(%d,%d,%d)",selectedColor.red(),selectedColor.green(),selectedColor.blue());this->setStyleSheet(style);
} else {// 用户取消了选择QMessageBox::information(this, "颜色选择", "您没有选择任何颜色");
}

在这里插入图片描述

在这个例子中,getColor() 方法显示了一个颜色选择对话框,对话框的初始颜色设置为蓝色(Qt::blue),父窗口为当前窗口(this),对话框标题为“选择颜色”。用户选择颜色后,如果点击了“确定”,则 getColor() 方法返回用户选择的颜色;如果用户点击了“取消”,则返回一个无效的 QColor 对象。

  1. 自定义 QColorDialog

虽然 QColorDialog 提供了丰富的颜色选择功能,但如果你需要更进一步的自定义(比如添加额外的控件或修改对话框的布局),你可能需要直接实例化 QColorDialog 类的对象,并调用其非静态方法(如 exec())来显示对话框。然而,需要注意的是,QColorDialog 的布局和控件通常不是为直接子类化而设计的,因此在进行此类自定义时应当谨慎。

  1. 处理颜色选择

如上面的示例所示,你可以通过检查 QColorDialog::getColor() 返回的 QColor 对象是否有效(使用 isValid() 方法)来判断用户是否选择了颜色。如果选择了颜色,你可以进一步处理这个颜色,比如用它来设置窗口背景、文本颜色等。

总之,QColorDialog 是 Qt 中一个非常实用且易于使用的类,能够帮助你快速地在应用程序中实现颜色选择功能。

👉🏻QFileDialog

QFileDialog 是 Qt 框架中的一个类,用于提供一个对话框,允许用户浏览文件系统,选择文件或目录。这个类非常强大,支持多种文件选择模式,如打开文件、保存文件、选择目录等,并且可以定制对话框的多个方面,如标题、初始目录、文件过滤器等。

以下是 QFileDialog 的基本用法:

  1. 包含必要的头文件

首先,确保你的项目中包含了 QFileDialog 所需的头文件。

#include <QFileDialog>
  1. 使用静态函数

QFileDialog 提供了一系列静态函数,如 getOpenFileName()getOpenFileNames()getSaveFileName()getExistingDirectory(),这些函数可以直接调用,显示一个对话框,并根据用户的操作返回相应的结果。

打开文件

QString fileName = QFileDialog::getOpenFileName(this,tr("打开文件"),"", // 可以指定初始目录,这里为空表示使用当前目录tr("文本文件 (*.txt);;所有文件 (*.*)")); // 文件过滤器if (!fileName.isEmpty()) {// 处理文件名
}

tr() 是一个宏,用于国际化和本地化支持。它用于将字符串标记为可翻译的,这样当应用程序需要支持多种语言时,这些字符串就可以被翻译成相应的语言

打开多个文件

QStringList fileNames = QFileDialog::getOpenFileNames(this,tr("打开文件"),"",tr("图片文件 (*.png *.jpg *.bmp);;所有文件 (*.*)"));if (!fileNames.isEmpty()) {// 处理文件列表
}

保存文件

QString fileName = QFileDialog::getSaveFileName(this,tr("保存文件"),"",tr("文本文件 (*.txt);;所有文件 (*.*)"));if (!fileName.isEmpty()) {// 处理文件名,通常用于保存文件
}

选择目录

QString dirName = QFileDialog::getExistingDirectory(this,tr("选择目录"),"",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);if (!dirName.isEmpty()) {// 处理目录名
}
  1. 自定义 QFileDialog

虽然静态函数非常方便,但如果你需要更复杂的自定义(比如添加额外的按钮或控件),你可能需要直接实例化 QFileDialog 类的一个对象,并调用其非静态方法(如 exec())来显示对话框。

QFileDialog dialog(this);
dialog.setWindowTitle(tr("自定义文件对话框"));
dialog.setDirectory(QDir::homePath()); // 设置初始目录
dialog.setNameFilter(tr("图片文件 (*.png *.jpg *.bmp)")); // 设置文件过滤器if (dialog.exec() == QDialog::Accepted) {QStringList fileNames = dialog.selectedFiles();// 处理选中的文件列表
}
  1. 注意事项
  • 在使用 QFileDialog 时,请确保你已经有一个有效的 Qt 应用程序上下文(比如你已经创建了一个 QApplication 对象)。
  • 静态函数和非静态对象的使用场景不同,静态函数更适合简单的文件选择需求,而非静态对象则提供了更多的自定义可能性。
  • 文件过滤器(setNameFilter 或静态函数中的文件过滤器参数)允许你指定哪些类型的文件应该显示在对话框中,这对于提高用户体验非常有帮助。

👉🏻QFontDialog

QFontDialog 是 Qt 框架中的一个类,它提供了一个对话框,允许用户选择字体及其属性(如字体样式、大小、加粗、斜体等)。这个对话框是预配置的,但也可以进行一定程度的自定义。以下是 QFontDialog 的基本用法:

  1. 包含必要的头文件

首先,确保你的项目中包含了 QFontDialog 所需的头文件。

#include <QFontDialog>
#include <QFont>
  1. 使用 QFontDialog

QFontDialog 可以以两种方式使用:作为模态对话框(通过调用 exec() 方法)或作为非模态对话框(通过其他方式显示,但通常不推荐这样做,因为标准用法是模态的)。

模态对话框示例

// 假设这段代码在Qt Widgets应用程序的某个槽函数或函数中
void MyWidget::openFontDialog() {bool ok;QFont font = QFontDialog::getFont(&ok, this);if (ok) {// 用户点击了“确定”,font变量现在包含了用户选择的字体// 你可以在这里使用font变量来设置文本控件的字体ui->pushButton->setFont(font);qDebug()<<font<<endl;}// 如果用户点击了“取消”,则不会执行这个if块
}

在这个例子中,getFont() 是一个静态函数,它显示一个模态对话框,并允许用户选择一个字体。如果用户点击了“确定”,则函数返回用户选择的字体,并将 ok 设置为 true。否则,如果用户点击了“取消”,则返回的字体将是默认字体(但你可能不会使用它),并将 ok 设置为 false

自定义 QFontDialog

虽然 QFontDialog 的标准用法足够灵活,但如果你需要进一步的自定义(比如添加额外的控件或更改对话框的某些方面),你可能需要直接实例化 QFontDialog 类的一个对象。

QFontDialog *dialog = new QFontDialog(this);
// 可以在这里对dialog进行自定义,比如设置初始字体、标题等
// ...
if (dialog->exec() == QDialog::Accepted) {QFont selectedFont = dialog->currentFont();// 使用selectedFont进行字体设置
}
// 注意:通常你会在适当的时候删除dialog对象,比如在这个函数结束时
// 但在这个例子中,由于dialog是一个指向堆上对象的指针,你可能需要在其他地方管理它的生命周期
// 或者,你可以使用智能指针(如QSharedPointer或std::unique_ptr)来自动管理内存

👉🏻QInputDialog

QInputDialog 是 Qt 框架中的一个对话框类,用于获取用户输入的数据。它提供了多种输入类型的方法,包括文本、整数、浮点数和选项等,从而简化了用户输入的过程。以下是 QInputDialog 的基本用法介绍:

  1. 包含头文件

首先,需要在使用 QInputDialog 的文件中包含其头文件:

#include <QInputDialog>
  1. 使用静态函数

QInputDialog 提供了多个静态函数,如 getText()getInt()getDouble()getItem() 等,用于显示不同类型的输入对话框。这些函数会立即显示对话框并等待用户输入,然后返回用户输入的数据。

  • getText():用于获取用户输入的文本。

    QString text = QInputDialog::getText(this, "Input Dialog", "Enter your name:");
    if (!text.isEmpty()) {// 使用用户输入的文本
    }
    
  • getInt():用于获取用户输入的整数。可以指定范围、初始值和步长。

    bool ok;
    int number = QInputDialog::getInt(this, "Integer Input", "Enter a number:", 10, 0, 100, 1, &ok);
    if (ok) {// 使用用户输入的整数
    }
    
  • getDouble():用于获取用户输入的浮点数。同样可以指定范围、初始值和精度。

    bool ok;
    double value = QInputDialog::getDouble(this, "Double Input", "Enter a double:", 3.14, 0.0, 100.0, 2, &ok);
    if (ok) {// 使用用户输入的浮点数
    }
    
  • getItem():用于显示一个列表,让用户从中选择一个条目。

    QStringList items;
    items << "Option 1" << "Option 2" << "Option 3";
    bool ok;
    QString item = QInputDialog::getItem(this, "Item Selection", "Please choose an item:", items, 0, false, &ok);
    if (ok && !item.isEmpty()) {// 使用用户选择的条目
    }
    

0:这个参数是 editable 索引的占位符,但在 getItem() 方法中实际上并不直接使用它,因为 getItem() 不支持直接设置下拉列表的某个条目为可编辑(在标准的 QInputDialog::getItem() 使用方式中)。这个位置的参数在早期的 Qt 版本或某些误解中可能被认为是用来指示可编辑条目的索引,但在标准的 getItem() 调用中,这个参数是被忽略的。不过,在一些变体的对话框(比如通过 QInputDialog 的非静态方式创建并自定义时)中,可能会有类似的机制来允许编辑列表中的某个项目,但这不是 getItem() 静态方法直接支持的。
对于 getItem(),这里的 0 可以看作是填充参数位置的一个示例值,它并不影响 getItem() 的行为。实际上,这个位置的参数在 getItem() 方法的当前实现中并不被使用。
false:这个参数是 forceEditable 的标志。然而,在 QInputDialog::getItem() 的上下文中,这个参数并不被直接使用,因为 getItem() 方法本身并不支持将下拉列表设置为可编辑的。在 Qt 的其他上下文或自定义对话框中,forceEditable 可能用于指示是否强制某个控件为可编辑状态,但在 getItem() 中,它不起作用。对于 getItem(),你应该将这个参数视为是 API 的一部分,但在当前的使用场景中并不需要特别关注它。


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Debian11.9镜像基于jre1.8的Dockerfile

Debian11.9基于jre1.8的Dockerfile编写 # 使用Debian 11.9作为基础镜像 FROM debian:11.9 # 维护者信息&#xff08;建议使用LABEL而不是MAINTAINER&#xff0c;因为MAINTAINER已被弃用&#xff09; LABEL maintainer"caibingsen" # 创建一个目录来存放jre …

短剧市场快速发展,短剧APP成为了新的商业机遇

近几年&#xff0c;短剧作为一匹行业黑马&#xff0c;展现出了自身爆发式的发展态势&#xff0c;成功获得了大众关注&#xff0c;短剧的用户群体更是在持续上升&#xff0c;市场规模将达到500亿&#xff0c;发展前景巨大&#xff01; 目前&#xff0c;短剧都在小程序或者APP上…

多态(上)【C++】

文章目录 多态的概念多态的实现多态产生的条件什么是虚函数&#xff1f;虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写&#xff1f; 多态的概念 C中的多态是面向对象编程&#xff08;OOP&#xff09;的一个核心特性&#xff0c;指的是同一个接口…

员工监控系统有哪些?6款员工屏幕监控系统大揭秘!(老板必看)

在企业管理中&#xff0c;如何提升员工工作效率并保障公司信息安全始终是管理者关注的焦点。 员工屏幕监控系统正是一个强大的工具&#xff0c;能够帮助企业了解员工的工作状态、管理工作进程&#xff0c;同时防止数据泄露。 今天小编就来为大家揭秘6款优秀的员工监控系统&…

JDK 家族成员 OpenKona 介绍

之前介绍过 JDK 的家族成员&#xff0c;具体戳这里。 本文将介绍 OpenKona(TencentKona)。 OpenKona 是基于 OpenJDK 研发的、支持国内技术生态和标准、开放源代码的 Java 开发工具包。OpenKona 兼容 JavaSE 规范&#xff0c;经过海量业务生产验证&#xff0c;生产环境开箱即用…

【linux笔记dpkg-buildpackage打包】把一个helloworld程序打包为deb包

说明 打包发布可以不用编译源代码安装&#xff0c;看起来是更方便的软件拷贝方式&#xff0c;下面是一个dpkg-buildpackage工具的最简打包过程实例 先建立一个helloworld程序 main.c #include <stdio.h>int main() {printf("Hello, World!\n");return 0; }…

长短期记忆网络和UKF的结合|Python代码例程

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中具有广泛的应用前景。 文章目录 结合LSTM和UKF的背景结合LSTM和UKF的优势应用实例研究现状Python代码示例结合LSTM和UKF的背景 长短期记忆网络(LSTM)是一种特殊的递归神经网络(RNN),…

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会&#xff08;“CIOE中国光博会”&#xff09;今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来&#xff0c;驱动应用创新”为主题&#xff0c;吸引了全球超过3700家优质光电企业参展&#xff0c;展示了光电产业的最新成果和前沿技术。 电…

动手学深度学习(pytorch土堆)-04torchvision中数据集的使用

CIFAR10 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每个类有 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为 5 个训练批次和 1 个测试批次&#xff0c;每个批次有 10000 张图像。测试批次包含每个类中随机选择的 1000 张图像…

【基础算法总结】位运算

目录 一&#xff0c;常见位运算操作总结二&#xff0c;算法原理和代码实现191.位1的个数338.比特位计数461.汉明距离面试题01.01.判断字符是否唯一268.丢失的数字371.两整数之和136.只出现一次的数字137.只出现一次的数字II260.只出现一次的数据III面试题17.19.消失的两个数字 …

DIODE:超高分辨率室内室外数据集(猫脸码客 第186期)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 在计算…

抗菌肽;Parasin I;KGRGKQGGKVRAKAKTRSS;CAS号:219552-69-9

【Parasin I 简介】 Parasin I是一种抗菌肽&#xff0c;由19个氨基酸组成&#xff0c;最初从鲶鱼的皮肤粘液中分离得到。它具有广谱的抗菌活性&#xff0c;能够有效对抗革兰氏阳性菌和革兰氏阴性菌&#xff0c;包括一些对传统抗生素具有耐药性的菌株。 【中文名称】抗菌肽 Par…

USB摄像头视频流转RTSP流

一、VLC查看USB摄像头视频流原理&#xff1a; USB摄像头的工作原理与VLC播放其他视频文件类似&#xff0c;主要区别在于视频流的来源是实时捕获的&#xff0c;而不是预先录制的文件。如果使用VLC将USB摄像头的视频流作为RTSP服务器广播&#xff0c;需要进一步配置 二、VLC查看…

Java 设计模式-状态模式

目录 一. 概述 二. 主要角色 三. 代码示例 四. 优缺点 优点&#xff1a; 缺点&#xff1a; 五. 常见应用场景 一. 概述 状态模式是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定…

新型 Vo1d 恶意软件曝光,超130万台安卓电视设备已中招

近日&#xff0c;有攻击者使用一种新的 Vo1d 后门恶意软件感染了 130 余万台安卓电视流媒体盒&#xff0c;使得攻击者能够完全控制这些设备。 Android TV是谷歌针对智能电视和流媒体设备推出的操作系统&#xff0c;为电视和远程导航提供了优化的用户界面&#xff0c;集成了谷歌…

MySQL--库的操作

文章目录 1.创建数据库2.创建数据库案例3.字符集和校验规则3.1默认字符集3.2默认校验规则3.3查看系统默认字符集以及校验规则3.4查看数据库支持的字符3.5查看数据库支持的字符集校验规则3.6校验规则对数据库的影响不区分大小写查询&#xff1a;排序结果&#xff1a;区分大小写查…

架构师白话分布式系统

对于分布式系统的定义,大致可以理解为如下的两个点 分布式系统从整体的体量来说,它内部是由很多的服务器、服务实例组成。所提供的用户服务是由一组相互独立运行的服务器来提供。对于用户来说,这个多服务器的系统就跟一个服务器一样,感觉不到每个单独的服务器实例的存在。从…

JSON串

JSON在客户端的使用 JSON 字符串的格式是基于键值对的数据结构&#xff0c;用于表示结构化数据。它遵循严格的语法规则&#xff0c;常用于前后端数据交互。 1. 基本结构 JSON 数据结构由两种主要元素构成&#xff1a; 对象&#xff08;Object&#xff09;&#xff1a;用花括…

小阿轩yx-Zabbix企业级分布式监控环境部署

小阿轩yx-Zabbix企业级分布式监控环境部署 前言 “运筹帷幄之中&#xff0c;决胜千里之外”监控在 IT 运维中占据着重要地位&#xff0c;按比例说占 30% 也不为过在监控系统开源软件中有很多可选择的工具&#xff0c;但是真正符合要求的、能够真正解决业务问题的监控系统软件…

UML的图及其他图补充

一、UML图 1.类图 ‌类图‌是统一建模语言&#xff08;UML&#xff09;中的一种静态结构图&#xff0c;主要用于描述软件系统的静态结构。它显示了模型中的类、类的内部结构以及它们与其他类的关系。类图是面向对象建模的主要组成部分&#xff0c;用于对系统的词汇进行建模、对…