六、标准对话框、多应用窗体

一、标准对话框

Qt提供了一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息提示和确认选择对话框、标准输入对话框等。

1、预定义标准对话框

(1)QFileDialog 文件对话框

  • QString getOpenFileName() 打开一个文件
  • QstringList getOpenFileNames() 打开多个文件
  • QString getSaveFileName() 选择保存一个文件
  • QString getExistingDirectory() 选择一个已有目录
  • QUrl getOpenFileUrl() 打开一个网络文件

(2)QColorDialog 颜色对话框

  • QColor getColor() 选择颜色

(3)QFontDialog 选择字体

  • QFont getFont() 选择字体

(4)QInputDialog 输入对话框

  • QString getText() 的呼入单行文字
  • int getInt() 输入整数
  • double getDouble() 输入浮点数
  • QString getItem() 从一个下拉列表中选择输入
  • QString getMultiLineText() 输入多行字符串

(5)QMessageBox 消息对话框

  • StandardButton information() 信息提示对话框
  • StandardButton question() 询问并获取是否确定对话框
  • StandardButton warning() 警告信息提示对话框
  • StandardButton critical() 错误信息提示对话框
  • void about() 设置自定义信息的关于对话框
  • void aboutQt() 关于Qt的对话框

2、实现工具

(1)创建项目,基于QDialog

(2)添加组件

在这里插入图片描述

(3)实现信号与槽

#include "dialog.h"
#include "ui_dialog.h"#include <QFileDialog>
#include <QColorDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_btnClearText_clicked()
{ui->plainTextEdit->clear();
}void Dialog::on_btnOpenFile_clicked()
{QString strCurPath = QDir::currentPath();QString strTitle = "选择文件对话框";QString strFilter = "文本文件(*.txt);;图片文件(*.ipg *.png);;所有格式(*.*)";  // 文件选择过滤器QString strFileName = QFileDialog::getOpenFileName(this, strTitle, strCurPath,strFilter);if(strFileName.isEmpty()){return;}ui->plainTextEdit->appendPlainText(strFileName);
}void Dialog::on_btnOpenFiles_clicked()
{QString strCurPath = QDir::currentPath();QString strTitle = "选择文件对话框";QString strFilter = "文本文件(*.txt);;图片文件(*.ipg *.png);;所有格式(*.*)";  // 文件选择过滤器QStringList FileNames = QFileDialog::getOpenFileNames(this, strTitle, strCurPath,strFilter);if(FileNames.count() == 0){return;}foreach (QString strFileName, FileNames){ui->plainTextEdit->appendPlainText(strFileName);}
}void Dialog::on_btnSelectDir_clicked()
{QString strCurPath = QDir::currentPath();QString strTitle = "选择文件对话框";QString strSelectDir = QFileDialog::getExistingDirectory(this, strTitle, strCurPath,QFileDialog::ShowDirsOnly);if(strSelectDir.isEmpty()){return;}ui->plainTextEdit->appendPlainText(strSelectDir);
}void Dialog::on_btnSaveFile_clicked()
{QString strCurPath = QCoreApplication::applicationDirPath();QString strTitle = "选择文件对话框";QString strFilter = "文本文件(*.txt);;图片文件(*.ipg *.png);;所有格式(*.*)";  // 文件选择过滤器QString strFileName = QFileDialog::getSaveFileName(this, strTitle, strCurPath,strFilter);if(strFileName.isEmpty()){return;}ui->plainTextEdit->appendPlainText(strFileName);
}void Dialog::on_btnSelectColor_clicked()
{QPalette pal = ui->plainTextEdit->palette();QColor initColor = pal.color(QPalette::Text);QColor color = QColorDialog::getColor(initColor, this, "选择颜色");if(!color.isValid()){return;}pal.setColor(QPalette::Text, color);ui->plainTextEdit->setPalette(pal);
}void Dialog::on_btnSelectFont_clicked()
{bool ok = false;QFont initFont = ui->plainTextEdit->font();QFont font = QFontDialog::getFont(&ok, initFont, this, "选择字体");if(!ok){return;}ui->plainTextEdit->setFont(font);
}void Dialog::on_btnInputString_clicked()
{QString strTitle = "输入文字对话框";QString strLabel = "请输入文字";QString strDefault = "默认文字";QLineEdit::EchoMode echoMode = QLineEdit::Normal;bool ok = false;QString str = QInputDialog::getText(this, strTitle, strLabel,echoMode, strDefault, &ok);if(!ok){return;}ui->plainTextEdit->appendPlainText(str);
}void Dialog::on_btnInputInt_clicked()
{QString strTitle = "输入整数对话框";QString strLabel = "请输入数字";int nDefault = ui->plainTextEdit->font().pointSize();int nMinValue = 0, nMaxValue = 100;bool ok = false;int nValue = QInputDialog::getInt(this, strTitle, strLabel, nDefault,nMinValue, nMaxValue, 1, &ok);if(!ok){return;}QFont font = ui->plainTextEdit->font();font.setPointSize(nValue);ui->plainTextEdit->setFont(font);ui->plainTextEdit->appendPlainText(QString::asprintf("输入整数:%d", nValue));
}void Dialog::on_btnInputFloat_clicked()
{QString strTitle = "输入整数对话框";QString strLabel = "请输入数字";double dDefault = 10.123;double dMinValue = 0.0, dMaxValue = 100.0;bool ok = false;double dValue = QInputDialog::getDouble(this, strTitle, strLabel, dDefault,dMinValue, dMaxValue, 3, &ok);if(!ok){return;}ui->plainTextEdit->appendPlainText(QString::asprintf("输入整数:%.3lf", dValue));
}void Dialog::on_btnInputSelect_clicked()
{QStringList items;items << "条目1" << "条目2" << "条目3" << "条目4";QString strTitle = "输入条目对话框";QString strLabel = "请选择一个条目";bool ok = false;QString str = QInputDialog::getItem(this, strTitle, strLabel, items, 0,true, &ok);if(!ok || str.isEmpty()){return;}ui->plainTextEdit->appendPlainText(str);
}void Dialog::on_btnQuestion_clicked()
{QString strTitle = "Question消息框";QString strLabel = "选择是与否";QMessageBox::StandardButton result = QMessageBox::question(this, strTitle, strLabel,QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,QMessageBox::Cancel);if(result == QMessageBox::Yes){ui->plainTextEdit->appendPlainText("Yes");}else if (result == QMessageBox::No){ui->plainTextEdit->appendPlainText("No");}else if (result == QMessageBox::Cancel){ui->plainTextEdit->appendPlainText("Cancel");}
}void Dialog::on_btnInformation_clicked()
{QMessageBox::information(this, "Information对话框", "信息", QMessageBox::Ok);
}void Dialog::on_btnWarning_clicked()
{QMessageBox::warning(this, "Warning对话框", "警告", QMessageBox::Ok);
}void Dialog::on_btnCritical_clicked()
{QMessageBox::critical(this, "Critical对话框", "错误", QMessageBox::Ok);
}void Dialog::on_btnAbout_clicked()
{QMessageBox::about(this, "About对话框", "关于");
}void Dialog::on_btnAboutQt_clicked()
{QMessageBox::aboutQt(this, "About对话框");
}

二、自定义标准对话框

1、实现工具

  • QWDialogSize 设置表格行列数对话框
  • QWDialogHeaders 设置表头对话框
  • QWDialogLocate 单元格定位于文字设置对话框
    在这里插入图片描述

(1)创建项目,基于QMainWindow

(2)添加组件

在这里插入图片描述

#include "qdialogsetsize.h"
#include "ui_qdialogsetsize.h"#include <QMessageBox>int QDialogSetSize::rowCount()
{return ui->spinBoxRow->value();
}int QDialogSetSize::columnCount()
{return ui->spinBoxColumn->value();
}void QDialogSetSize::setRowColumns(int nRow, int nColumn)
{ui->spinBoxRow->setValue(nRow);ui->spinBoxColumn->setValue(nColumn);
}QDialogSetSize::QDialogSetSize(QWidget *parent) :QDialog(parent),ui(new Ui::QDialogSetSize)
{ui->setupUi(this);
}QDialogSetSize::~QDialogSetSize()
{QMessageBox::information(this, "", "设置大小对话框已经退出");delete ui;
}

(3)添加设置表格行列数UI于类

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

(4)添加设置表头的UI与类

在这里插入图片描述

#include "qdialogsetheaders.h"
#include "ui_qdialogsetheaders.h"QDialogSetHeaders::QDialogSetHeaders(QWidget *parent) :QDialog(parent),ui(new Ui::QDialogSetHeaders)
{ui->setupUi(this);theModel = new QStringListModel(this);ui->listView->setModel(theModel);
}QDialogSetHeaders::~QDialogSetHeaders()
{QMessageBox::information(this, "", "设置表头对话框退出");delete ui;
}void QDialogSetHeaders::setStringList(QStringList strList)
{theModel->setStringList(strList);
}QStringList QDialogSetHeaders::getStringList()
{return theModel->stringList();
}

(5)添加定位单元格UI与类

在这里插入图片描述

#include "qdialoglocate.h"
#include "ui_qdialoglocate.h"
#include <QMessageBox>QDialogLocate::QDialogLocate(QWidget *parent) :QDialog(parent),ui(new Ui::QDialogLocate)
{ui->setupUi(this);
}QDialogLocate::~QDialogLocate()
{QMessageBox::information(this, "", "单元格定位对话框退出");delete ui;
}void QDialogLocate::setRange(int nRow, int nColumn)
{ui->spinBoxRow->setRange(0, nRow - 1);ui->spinBoxCol->setRange(0, nColumn - 1);
}void QDialogLocate::setValue(int nRow, int nColumn)
{ui->spinBoxRow->setValue(nRow);ui->spinBoxCol->setValue(nColumn);
}#include <mainwindow.h>
void QDialogLocate::closeEvent(QCloseEvent *event)
{Q_UNUSED(event)MainWindow *parent = (MainWindow*)parentWidget();parent->setActLocateEnable(true);parent->resetDlgLocate();
}void QDialogLocate::on_btnSetText_clicked()
{int row = ui->spinBoxRow->value();int col = ui->spinBoxCol->value();MainWindow *parent = (MainWindow*)parentWidget();parent->setCelltext(row, col, ui->lineEdit->text());if(ui->checkBoxAddRow->isChecked()){ui->spinBoxRow->setValue(ui->spinBoxRow->value() + 1);}if(ui->checkBoxAddCol->isChecked()){ui->spinBoxCol->setValue(ui->spinBoxCol->value() + 1);}}

(6)设置主程序功能

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);theModel = new QStandardItemModel(this);theSelect = new QItemSelectionModel(theModel);ui->tableView->setModel(theModel);ui->tableView->setSelectionModel(theSelect);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::setActLocateEnable(bool enable)
{ui->actLocate->setEnabled(enable);
}void MainWindow::resetDlgLocate()
{dialogLocate = nullptr;
}void MainWindow::setCelltext(int row, int col, QString strText)
{QModelIndex index = theModel->index(row, col);theModel->setData(index, strText, Qt::DisplayRole);theSelect->clearSelection();theSelect->setCurrentIndex(index, QItemSelectionModel::Select);
}#include "qdialogsetsize.h"
void MainWindow::on_actSetSize_triggered()
{QDialogSetSize *dlg = new QDialogSetSize(this);dlg->setRowColumns(theModel->rowCount(), theModel->columnCount());int ret = dlg->exec();if(ret == QDialog::Accepted){int row = dlg->rowCount();int col = dlg->columnCount();theModel->setRowCount(row);theModel->setColumnCount(col);}delete dlg;
}void MainWindow::on_actSetHeader_triggered()
{if(nullptr == dialogHeader){dialogHeader = new QDialogSetHeaders(this);}if(dialogHeader->getStringList().count() != theModel->columnCount()){QStringList strList;for (int i = 0; i < theModel->columnCount(); ++i){strList << theModel->headerData(i, Qt::Horizontal).toString();}dialogHeader->setStringList(strList);}int ret = dialogHeader->exec();if(ret == QDialog::Accepted){QStringList strList = dialogHeader->getStringList();theModel->setHorizontalHeaderLabels(strList);}
}void MainWindow::on_actLocate_triggered()
{ui->actLocate->setEnabled(false);if(nullptr == dialogLocate){dialogLocate = new QDialogLocate(this);}dialogLocate->setAttribute(Qt::WA_DeleteOnClose); //关闭自动删除Qt::WindowFlags flags = dialogLocate->windowFlags();dialogLocate->setWindowFlags(flags | Qt::WindowCloseButtonHint); //置于主界面上层dialogLocate->setRange(theModel->rowCount(), theModel->columnCount());QModelIndex curIndex = theSelect->currentIndex();if(curIndex.isValid()){dialogLocate->setValue(curIndex.row(), curIndex.column());}dialogLocate->show();
}void MainWindow::on_tableView_clicked(const QModelIndex &index)
{if(dialogLocate != nullptr){dialogLocate->setValue(index.row(), index.column());}
}

三、多窗体应用程序设计

1、视图类

  • QWidget:在没有指定父容器时,可以作为独立的窗口,指定父容器后可以作为容器的内部组件
  • QDialog:设计对话框,以独立窗口显示
  • QMainWindow:用于设计带有菜单栏、工具栏、状态栏的主窗口,一般独立窗口显示。
  • QSplashScreen:用作应用程序启动时的splash窗口,没有边框。
  • QMdiSubWindow:用于为QMdiArea提供一个子窗体,用于MDI(多文档)的设计。
  • QDesktopWidget:具有多个显卡和多个显示器的系统具有多个左面,这个类提供用户桌面信息,如屏幕个数,每个屏幕的大小等。
    QWindow:通过底层的窗口系统表示一个窗口类,一般作为一个父容器的嵌入式窗体,不作为独立窗体。
QObjectQWidgetQDialogQMainWindowQSplashScreenQMdiSubWindowQDesktopWidgetQWindow

2、窗体特性

(1)设置运行特性和显示特性

void QWidget::setWindowState(Qt::WindowStates windowstate)Qt::NonModal 无模态,不会阻止其他窗体的输入Qt::WindowModal 窗口对于其父窗口、所有的商机父窗口都是模态的Qt::ApplicationModal 窗口对整个应用程序时模态的,阻止所有窗口的输入
void QWidget::setWindowOpacity(qreal level)参数level是1.0(完全不透明)至0.0(完全透明)之间的数。窗口透明度缺省值为1.0,即完全不透明。
void QWidgwt::setAttribute(Qt::WidgwtAttribute attribute, bool on = true)Qt::WA_AcceptDrops	允许窗体接受拖拽来的组件Qt::WA_DeleteOnClose	窗体关闭时删除自己,释放内存Qt::WA_Hover	鼠标进入或移除窗体时产生paint事件Qt::WA_AcceptTouchEvents	窗体是否接受触屏事件
表示窗体类型
void QWidget::setWindowFlags(Qt::WindowFlags type)Qt::Widget	这是QWidget类的缺省类型,如果有父窗体,就作为父窗体的子窗体,否则就作为一个独立的窗口Qt::Window	表明这个窗体是一个窗口,通常具有窗口的边框、标题栏,而不管它是都有父窗体Qt::Dialog	表明窗体是一个窗口,并且要显示为对话框(如:没有标题栏、没笑最小化、最大化),这是QDialog类的缺省类型Qt::Popup	表明扯个窗体是用作弹出式菜单的窗体Qt::Tool	表明这个窗体是工具窗体,具有更小的标题栏和关闭按钮,通常作为工具栏的窗体Qt::ToolTip	表明这是用于ToolTip消息提示的窗体Qt::SplashScreen	表明窗体是Splash屏幕,是QSplashScreen类的缺省类型Qt::DeskTop	表明窗体时桌面,这是QDesktopWidget类的类型Qt::SubWindow	表明窗体是子窗体,例如QMdiSubWindow就是这种类型
控制窗体显示效果Qt::MSWindowsFisedSizeDialogHint	在WIndows平台上,是的窗口具有更窄的边框Qt::FramelessWindowHint		创建无边框窗口
QindowHint要行医窗体外观定制窗体外观的常量,需要先设置Qt::CustomizeQt::CustmizeWindowHint	关闭缺省的窗口标题栏Qt::WindowTitleHint		窗口有标题栏Qt::WindowSystemMenuHint	有窗口系统菜单Qt::WindowMinimizeButtonHint	有最小化按钮Qt::WindowMaximizeButtonHint	有最大化按钮Qt::WindowMinMaxButtonHint	有最小化、最大化按钮Qt::WindowCloseButtonHint	有关闭按钮Qt::wContextHelpButtonHint	有上下文帮助按钮Qt::WindowStaysOnTopHint	窗口总是处于最上层Qt::WindowStaysOnBottomHint	窗口总是处于最下层Qt::WindowtransparentForInput	窗口只作为输出,不接受输入	

3、实现工具

(1)创建项目,基于QMainWindow

(2)添加源文件图标

(3)添加工具栏

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

(4)添加UI界面

在这里插入图片描述

(5)实现功能

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setCentralWidget(ui->tabWidget);ui->tabWidget->setVisible(false);   //不显示}MainWindow::~MainWindow()
{delete ui;
}#include <QPainter>
void MainWindow::paintEvent(QPaintEvent *event)
{// 使用图片绘制底板Q_UNUSED(event)QPainter painter(this);painter.drawPixmap(0, ui->mainToolBar->height(), width(),height() - ui->mainToolBar->height() - ui->statusBar->height(),QPixmap(":/images/images/back.jpg"));
}#include "formdoc.h"
void MainWindow::on_actWidgetInsite_triggered()
{FormDoc *formDoc = new FormDoc(this);formDoc->setAttribute(Qt::WA_DeleteOnClose);int cur = ui->tabWidget->addTab(formDoc, QString::asprintf("Doc %d", ui->tabWidget->count()));ui->tabWidget->setCurrentIndex(cur);ui->tabWidget->setVisible(true);
}void MainWindow::on_tabWidget_tabCloseRequested(int index)
{if(index < 0){return;}QWidget* tab = ui->tabWidget->widget(index);tab->close();
}void MainWindow::on_tabWidget_currentChanged(int index)
{Q_UNUSED(index)if(ui->tabWidget->count() == 0){ui->tabWidget->setVisible(false);}
}void MainWindow::on_actWidget_triggered()
{FormDoc *formDoc = new FormDoc();formDoc->setAttribute(Qt::WA_DeleteOnClose);formDoc->setWindowTitle("Widget独立窗口");formDoc->setWindowOpacity(0.7); //半透明formDoc->show();
}#include "formtable.h"
void MainWindow::on_actMainWindowInsite_triggered()
{FormTable *formtable = new FormTable(this);formtable->setAttribute(Qt::WA_DeleteOnClose);int cur = ui->tabWidget->addTab(formtable, QString::asprintf("Table %d", ui->tabWidget->count()));ui->tabWidget->setCurrentIndex(cur);ui->tabWidget->setVisible(true);
}void MainWindow::on_actMainWindow_triggered()
{FormTable *formtable = new FormTable(this);formtable->setAttribute(Qt::WA_DeleteOnClose);formtable->setWindowTitle("MainWindow独立窗口");formtable->setWindowOpacity(0.7); //半透明formtable->show();
}

四、MDI应用程序设计

QMdiArea(Multiple Document Interface Area)提供一个可以同时显示多个文档窗口的区域。区域本身是一个框架,每个窗口是都一个QMdiSubWindow对象。
设置MDI视图窗口模式用setViewMode()函数,有两种选择:
setViewMode()QMdiArea::SubWindowView	传统的子窗口模式WMdiArea::TabbedView	多页显示模式,类似tabView

1、实现工具

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

(1)创建项目,基于QMainWindow

(2)添加资源文件,设置界面

在这里插入图片描述

(3)添加UI与类

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

(4)实现功能

#include "mainwindow.h"
#include "ui_mainwindow.h"#include "formdoc.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setCentralWidget(ui->mdiArea);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actDocNew_triggered()
{FormDoc *formDoc = new FormDoc(this);// formDoc->setAttribute(Qt::WA_DeleteOnClose); 不需要,框架会自动回收ui->mdiArea->addSubWindow(formDoc);formDoc->show();ui->actCopy->setEnabled(true);ui->actCut->setEnabled(true);ui->actPaste->setEnabled(true);ui->actFont->setEnabled(true);
}#include <QMdiSubWindow>
#include <QFileDialog>
void MainWindow::on_actDocOpen_triggered()
{bool needNew = false;FormDoc *formDoc = nullptr;if(ui->mdiArea->subWindowList().count() > 0){formDoc = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();needNew = formDoc->isFileOpenedDoc();}else{needNew = true;}if(needNew){formDoc = new FormDoc(this);ui->mdiArea->addSubWindow(formDoc);}QString strFileName = QFileDialog::getOpenFileName(this, "打开文档", "","文本文件(*.txt);;所有文件(*.*)");formDoc->loadFromFile(strFileName);formDoc->show();ui->actCopy->setEnabled(true);ui->actCut->setEnabled(true);ui->actPaste->setEnabled(true);ui->actFont->setEnabled(true);}void MainWindow::on_actCloseAll_triggered()
{ui->mdiArea->closeAllSubWindows();ui->actCopy->setEnabled(false);ui->actCut->setEnabled(false);ui->actPaste->setEnabled(false);ui->actFont->setEnabled(false);
}void MainWindow::on_actFont_triggered()
{FormDoc *formDoc = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->setTextFont();
}void MainWindow::on_actCut_triggered()
{FormDoc *formDoc = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textCut();
}void MainWindow::on_actCopy_triggered()
{FormDoc *formDoc = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textCopy();
}void MainWindow::on_actPaste_triggered()
{FormDoc *formDoc = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textPaste();
}void MainWindow::on_actMdiMode_triggered(bool checked)
{if(checked){ui->mdiArea->setViewMode(QMdiArea::TabbedView);ui->mdiArea->setTabsClosable(true); //可关闭ui->actCascade->setEnabled(false);ui->actTile->setEnabled(false);}else{ui->mdiArea->setViewMode(QMdiArea::SubWindowView);ui->actCascade->setEnabled(true);ui->actTile->setEnabled(true);}
}void MainWindow::on_actCascade_triggered()
{ui->mdiArea->cascadeSubWindows();
}void MainWindow::on_actTile_triggered()
{ui->mdiArea->tileSubWindows();
}void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{Q_UNUSED(arg1)// 将选项变化,显示在状态栏if(ui->mdiArea->subWindowList().count() == 0){ui->actCopy->setEnabled(false);ui->actCut->setEnabled(false);ui->actPaste->setEnabled(false);ui->actFont->setEnabled(false);ui->statusBar->clearMessage();}else{FormDoc *formDoc = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();ui->statusBar->showMessage(formDoc->getCurFileName());}
}

五、Splash与登录窗口

Qt有一个QSplashScreen类可以实现Splash窗口的功能,它提供了载入图片,自动设置窗口无边框效果功能。可以在加载界面使用。
	(QMouseEvent *)event->globalPos()	获取鼠标的位置,即鼠偏离屏幕左上角的位置pos()	获取主窗口(Widget窗口)左上角(边框的左上角,外左上角)相对于屏幕左上角的偏移位置。

1、实现工具

(1)拷贝上一个项目

(2)添加UI,选择Dialog

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

(3)添加登录验证

#include "mainwindow.h"
#include <QApplication>
#include "dialoglogin.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);DialogLogin *dlg = new DialogLogin();if(dlg->exec() == QDialog::Accepted){MainWindow w;w.show();return a.exec();}return 0;
}

(4)鼠标和窗口位置计算方法

在这里插入图片描述
使用向量原理,可以得到:使用鼠标的向量减去相对向量(鼠标相对窗口的向量),可以得出目标窗口的向量。

void DialogLogin::mousePressEvent(QMouseEvent *event)
{//左击if(event->button()  == Qt::LeftButton){m_moveing = true;m_lastPos = event->globalPos() - pos();}return QDialog::mousePressEvent(event);
}void DialogLogin::mouseMoveEvent(QMouseEvent *event)
{//移动if(m_moveing && (event->buttons() && Qt::LeftButton)){move(event->globalPos() - m_lastPos);m_lastPos = event->globalPos() - pos();}return QDialog::mouseMoveEvent(event);
}void DialogLogin::mouseReleaseEvent(QMouseEvent *event)
{//松开Q_UNUSED(event)m_moveing = false;//    return QDialog::mouseReleaseEvent(event);
}

(5)实现功能

#include "dialoglogin.h"
#include "ui_dialoglogin.h"DialogLogin::DialogLogin(QWidget *parent) :QDialog(parent),ui(new Ui::DialogLogin)
{ui->setupUi(this);setAttribute(Qt::WA_DeleteOnClose);setWindowFlag(Qt::SplashScreen); //关闭边框setFixedSize(this->width(), this->height());    // 禁止拖动窗口大小readSettings();
}DialogLogin::~DialogLogin()
{delete ui;
}void DialogLogin::mousePressEvent(QMouseEvent *event)
{//左击if(event->button()  == Qt::LeftButton){m_moveing = true;m_lastPos = event->globalPos() - pos();}return QDialog::mousePressEvent(event);
}void DialogLogin::mouseMoveEvent(QMouseEvent *event)
{//移动if(m_moveing && (event->buttons() && Qt::LeftButton)){move(event->globalPos() - m_lastPos);m_lastPos = event->globalPos() - pos();}return QDialog::mouseMoveEvent(event);
}void DialogLogin::mouseReleaseEvent(QMouseEvent *event)
{//松开Q_UNUSED(event)m_moveing = false;//    return QDialog::mouseReleaseEvent(event);
}#include <QSettings>
void DialogLogin::writeSettings()
{// 写入注册表QSettings settings("公司-liutt", "应用名称-text");settings.setValue("UserName", m_user);settings.setValue("Passwd", m_passwd);settings.setValue("saved", ui->checkBoxSave->isChecked());
}void DialogLogin::readSettings()
{// 读取注册表QSettings settings("公司-liutt", "应用名称-text");bool saved = settings.value("saved", false).toBool(); //默认值m_user = settings.value("UserName", "user").toString(); //默认值QString defaultPasswd = encrypt("123456"); //加密m_passwd = settings.value("Passwd", defaultPasswd).toString(); //默认值if(saved){ui->checkBoxSave->setChecked(true);ui->lineEditUser->setText(m_user);}
}#include <QCryptographicHash>
QString DialogLogin::encrypt(const QString &str)
{QByteArray btArray;btArray.append(str);QCryptographicHash hash(QCryptographicHash::Md5);hash.addData(btArray);QByteArray btResult = hash.result();QString md5 = btResult.toHex();return md5;
}#include <QMessageBox>
void DialogLogin::on_btnOk_clicked()
{QString strUser = ui->lineEditUser->text().trimmed();QString strPasswd = ui->lineEditPasswd->text().trimmed();if(strUser == m_user && encrypt(strPasswd) == m_passwd){writeSettings();accept();}else{m_tryCount++;if(m_tryCount > 3){QMessageBox::critical(this, "error", "错误次数太多,强制退出");reject();}QMessageBox::warning(this, "error", "账号不存在或密码错误");}
}

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

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

相关文章

You need to add dependency of ‘poi-ooxml‘ to your project, and version >= 4.1.2

原因 由于在依赖中引用了多个版本的 hutool,导致在最终打包时使用的版本不是由在开发时所引用的版本 cn.hutool.core.exceptions.DependencyException: You need to add dependency of poi-ooxml to your project, and version > 4.1.2at cn.hutool.poi.excel.ExcelUtil.get…

MyBatis-Plus 日常操作

本文主要介绍 mybatis-plus 日常操作。 一、快速开始 本文基于 springboot、maven、jdk1.8、mysql 环境。 新建如下数据库&#xff1a; 建议大家选择 utf8mb4 这种字符集&#xff0c;做过微信的同学应该会知道&#xff0c;微信用户名称的表情&#xff0c;是需要这种字符集才…

基于python旅游推荐系统 协同过滤算法 爬虫 Echarts可视化 Django框架(源码)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

Android14之DefaultKeyedVector实现(一百八十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

计算机组成原理 第一弹

ps&#xff1a;本文章的图片来源都是来自于湖科大教书匠高老师的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1-2 计算机的发展_哔哩哔哩_bilibili ​​ 目录 &#x1f680;计算机系统 &#x1f680;计…

基于SpringBoot的欢乐校园管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

SpringMVC搭建环境

idea创建java项目后添加webapp怎么配置 1.首先在main下创建一个普通文件webapp 2. 3.选中你的项目&#xff0c;添加Web 4.修改这两处的路径&#xff0c;修改为你webapp所在的路径 先修改左下角的路径&#xff0c;然后再添加web.xml. 然后再修改右上角的地址&#xff0c;注…

基于SpringBoot Vue家政服务预约平台系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

在vue中使用echarts渲染地图,geo点击某个区域可高亮,取消

一、安装echarts npm install echarts --save二、main.js引入注册 import Vue from "vue";import * as echarts from "echarts";Vue.prototype.$echarts echarts;三、vue文件中使用echarts <template><div class"page-warp"><…

Vue-30、Vue非单文件组件。

非单文件组件&#xff1a; 一个组件包含n个组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非单文件组件</title><script type"text/javascript" src"https://cdn.jsde…

BossCMS RCE

简介 BossCMS是一款基于自主研发PHP框架MySQL架构的内容管理系统&#xff0c;能够满足各类网站开发建设的需求。系统开源、安全、稳定、简洁、易开发、专注为中小型企业及政企单位、个人站长、广大开发者、建站公司提供一套简单好用的网站内容管理系统解决方案。官网提供了大量…

SystemVerilog中数组内置函数sum()的一个注意点

Systemverilog内置了数组求和运算方法(sum())&#xff0c;将数组的所有元素累加起来&#xff0c;返回一个最终值。在使用时要注意数组类型的位宽&#xff0c;通常情况下&#xff0c;如果你将一组单bit的值加起来&#xff0c;Systemverilog会使用足够的精度来确保不丢失任何bit的…

INS-06003错误处理

在麒麟V10操作系统上安装Oracle RAC 19C&#xff0c;安装GI的建立互信步骤中&#xff0c;遇到INS-06003错误&#xff1a; [INS-06003] Failed to setup password SSH connectivity with following node(s) 查看详细信息&#xff1a; PRVG-11001: PRCZ-2136: PRCZ-2006: 此时在操…

实验四 SQL语言

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

SSE[Server-Sent Events]实现页面流式数据输出(模拟ChatGPT流式输出)

文章目录 前言SSE 简介应用场景区分浏览器支撑性 实现过程Web VUE核心解析数据代码实例demo参考 前言 服务端向客户端推送消息&#xff0c;除了用WebSocket可实现&#xff0c;还有一种服务器发送事件(Server-Sent Events)简称 SSE&#xff0c;这是一种服务器端到客户端(浏览器)…

ChatGPT与文心一言:AI助手之巅的对决

随着科技的飞速发展&#xff0c;人工智能助手已经渗透到我们的日常生活和工作中。 而在这个充满竞争的领域里&#xff0c;ChatGPT和文心一言无疑是最引人注目的两款产品。它们各自拥有独特的优势&#xff0c;但在智能回复、语言准确性、知识库丰富度等方面却存在差异。那么&am…

mybatis xml多表查询,子查询,连接查询,动态sql

项目结构 数据库表 student_type 表 student 表 依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>org.…

Yield Guild Games 宣布与区块链游戏中心 Iskra 建立战略合作伙伴关系

Yield Guild Games (YGG) 宣布将向 Iskra 引入其任务系统&#xff0c;Iskra 是一个 Web3 游戏中心和发布平台&#xff0c;拥有超过 400 万注册钱包和 10 万月度活跃用户 (MAU)。在 LINE、Kakao、Wemade 和 Netmarble 等公司的支持下&#xff0c;Iskra 将游戏玩家和游戏工作室聚…

Java 内存模型深度解析

优质博文&#xff1a;IT-BLOG-CN 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题&#xff1a;线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中&#xff0c;线程之间的通信机制有两种&#xff1a;内存共享和消息传递&…

日常常见应用组件升级记录

一、前言 因近期安全扫描&#xff0c;发现java后端应用涉及多个引用组件版本过低&#xff0c;涉及潜在漏洞利用风险&#xff0c;特记录相关处理升级处理过程&#xff0c;以备后续确认&#xff1b; 二、升级处理过程 2.1、Java类应用内置Spring Boot版本升级 Spring Boot是一…