主窗體、QFile、編碼轉換、事件、禁止輸入特殊字符

主窗體

部件構成

菜單欄、工具欄、主窗體、狀態欄。

UI 編輯器設計主窗體

在這里插入圖片描述

💡 簡易記事本的實現(part 1)

在這里插入圖片描述

菜單欄

在這里插入圖片描述
在這里插入圖片描述

工具欄(圖標)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

主窗體

在這里插入圖片描述

完善菜單欄:
在這里插入圖片描述

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("新建文本文檔 - txt");this->setWindowIcon(QIcon("://notepad.png"));
}MainWindow::~MainWindow()
{delete ui;
}

Functions

狀態欄顯示提示信息

設置顯示的時長,時間單位:ms。

void showMessage(const QString & message, int timeout = 0);

設置標題欄的標題、圖標

void setWindowTitle(const QString &);  			// 設置標題欄的標題
void setWindowIcon(const QIcon & icon);  		// 設置標題欄的圖標

設置圖標然后運行,如果不能正常顯示,不用理會,是系統的問題。

QFile

繼承關系

QObject – QIODevice – QFileDevice – QFile
QIODevice:QT 對輸入輸出設備的抽象,提供了操作設備的一系列接口。

接口

QFile(const QString &name);  	// 使用文件名構造一個 QFile 對象,文件名可以包含路徑和文件名void	setFileName(const QString & name);  // 如果構造沒指定,也可以通過這個接口指定一下
bool	exists(); 							// 判斷文件是否存在
bool 	open(OpenMode mode); 				// 繼承自 QIODevice,OpenMode 取值:QIODevice::ReadOnlyQIODevice::WriteOnlyQIODevice::ReadWrite...bool 	atEnd();  					// 到達文件尾部
bool	remove();  					// 刪除文件
bool	rename(const QString & newName);	  // 重命名文件
qint64	read(char * data, qint64 maxSize);
QByteArray	read(qint64 maxSize);  	// 讀取最大maxSize字節,并返回一個QByteArray
QByteArray	readAll();  			// 讀取文件中所有數據,并返回一個QByteArrayqint64	write(const char * data, qint64 maxSize);
qint64	write(const QByteArray & byteArray);qint64	pos() const;  				// 得到當前讀寫指針的位置
bool 	seek(qint64 pos);  			// 重新設置讀寫指針位置bool QFileDevice::resize(qint64 sz); 	// 重設文件大小,可用于清空文件,比如 resize(0) qint64 size() const;				// 獲取文件大小

💡 簡易記事本的實現(part 2)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtWidgets>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_action_O_triggered();void on_action_S_triggered();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("新建文本文檔 - txt");this->setWindowIcon(QIcon("://notepad.png"));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_action_O_triggered()
{ui->statusBar->showMessage("Hello~", 0);QString filename = QFileDialog::getOpenFileName(this, tr("打開文件"), \".", tr("text  (*.c  *.cpp  *.txt)"));if (filename.isEmpty()){ui->statusBar->showMessage("打開失敗", 1500);return ;}QFile file(filename);if (!file.open(QIODevice::ReadOnly)){ui->statusBar->showMessage("打開失敗", 1500);return ;}ui->statusBar->showMessage("打開成功", 1500);QByteArray buffer = file.readAll();ui->textEdit->setText(QString(buffer));
//    ui->textEdit->setText(QString::fromUtf8(buffer));     // 可以//    QString str = QString::fromLocal8Bit(buffer);         // 不行,因為下面是 toUtf8
//    ui->textEdit->setText(QString(str));            }void MainWindow::on_action_S_triggered()
{QString filename = QFileDialog::getSaveFileName(this, tr("保存文件"), \QDir::homePath(), tr("text  (*.txt)"));if (filename.isEmpty()){ui->statusBar->showMessage("保存失敗", 1500);return ;}QFile file(filename);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){ui->statusBar->showMessage("保存失敗", 1500);return ;}QTextStream out(&file);QString str = ui->textEdit->toPlainText();QByteArray buffer;buffer.clear();buffer = str.toUtf8();out << buffer;          // file.write(buffer);ui->statusBar->showMessage("保存成功", 1500);file.close();
}

QIODevice::Text 是一種打開方式,用于文件的讀寫操作。當以 QIODevice::Text 方式打開文件時,在讀取文件內容時,回車換行符(\r\n)會被自動轉換為換行符(\n);在寫入文件內容時,換行符(\n)會被自動轉換為系統的換行符。
在這里插入圖片描述

編碼轉換

QT 界面只支持 utf-8 編碼。

QString	fromLocal8Bit(const QByteArray &str);  	// 將QByteArray按照本地編碼轉換為QString
QString	fromUtf8(const QByteArray &str); 		// 將QByteArray按照utf-8編碼轉換為QStringQByteArray	toLocal8Bit(); 			// 把QString按照本地編碼轉換成QByteArray
QByteArray	toUtf8(); 				// 把QString按照utf-8編碼轉換成QByteArray

事件

概念

事件由 窗口系統 或 QT 自身 以及 外部外設 產生,用以響應各種行為或情況。如:當按下鼠標或釋放鼠標時,會產生鼠標事件;按下鍵盤時出現按鍵事件。窗體有時需要捕捉這些事件并做出業務邏輯處理。

步驟

文字描述版:

所有的事件處理都是通過重寫某個事件方法來實現的

在這里插入圖片描述

圖片展示版:(以 QEvent::KeyPress 為例)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

💡 完善登錄模塊

要求:按回車鍵觸發登錄事件,按ESC 鍵退出登錄界面。

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QtWidgets>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>class Widget : public QWidget
{Q_OBJECTQPushButton *btn;QLineEdit *username;QLineEdit *password;QString usr;QString pwd;QLabel *label;QLabel *ulabel;QLabel *plabel;public:Widget(QWidget *parent = 0);~Widget();public slots:void verifySlot();protected:void keyPressEvent(QKeyEvent * event);};

widget.cpp

#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent)
{resize(480, 300);btn = new QPushButton("Login", this);       // 需要在堆區創建,不能在棧區創建btn->move(180, 220);ulabel = new QLabel("Username: ", this);ulabel->move(60, 80);username = new QLineEdit(this);username->move(180, 80);username->setPlaceholderText("Please input...");plabel = new QLabel("Password: ", this);plabel->move(60, 160);password = new QLineEdit(this);password->move(180, 160);password->setEchoMode(QLineEdit::Password);password->setPlaceholderText("Please input...");QObject::connect(btn, SIGNAL(clicked()), this, SLOT(verifySlot()));label = new QLabel(this);
}void Widget::verifySlot()
{usr = username->text();pwd = password->text();label->resize(480, 300);if (usr == "0828" && pwd == "0828"){
//        label->setText("Logined successfully!");             // 成功顯示,但不美觀qDebug("Logined successfully!");this->close();QWidget *homePage = new QWidget;homePage->resize(309, 500);homePage->show();}else{// QObject::connect(btn, SIGNAL(clicked()), this, SLOT(close()));          // 不能這樣寫,需要點擊兩次按鈕才會關閉小窗口this->close();}
}void Widget::keyPressEvent(QKeyEvent * event)
{
//    qDebug("%x", event->key());if(event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)this->verifySlot();else if(event->key() == Qt::Key_Escape)this->close();elseQWidget::keyPressEvent(event);
}Widget::~Widget()
{}

💡 禁止輸入特殊字符

在這里插入圖片描述

彈框

QToolTip::showText(this->mapToGlobal(this->pos()), "不能使用特殊字符", this);

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mytextedit.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);MyTextEdit *mine = new MyTextEdit(this);
}Widget::~Widget()
{delete ui;
}

mytextedit.h

#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H#include <QTextEdit>
#include <QtWidgets>class MyTextEdit : public QTextEdit				// .cpp, Line 25
{Q_OBJECT
public:explicit MyTextEdit(QWidget *parent = 0);signals:public slots:protected:void keyPressEvent(QKeyEvent * event);};#endif // MYTEXTEDIT_H

mytextedit.cpp

#include "mytextedit.h"MyTextEdit::MyTextEdit(QWidget *parent) :QTextEdit(parent)
{
}void MyTextEdit::keyPressEvent(QKeyEvent * event)
{qDebug("%x", event->key());switch(event->key()){case Qt::Key_Backslash:			// 5c、case Qt::Key_Slash:				// 2f、case Qt::Key_Colon:				// 3a、case Qt::Key_Asterisk:			// 2a、case Qt::Key_Question:			// 3f、case Qt::Key_QuoteDbl:			// 22、case Qt::Key_Less:				// 3c、case Qt::Key_Greater:			// 3e、case Qt::Key_Bar:				// 7cQToolTip::showText(this->mapToGlobal(this->pos()), "不能使用特殊字符", this);break;default:QTextEdit::keyPressEvent(event);		// .h, Line 7break;}
//    if (event->key() == Qt::Key_Backslash)
//        QToolTip::showText(this->mapToGlobal(this->pos()), "不能使用特殊字符", this);
//    else
//        QTextEdit::keyPressEvent(event);
}

運行結果如下:
在這里插入圖片描述
在這里插入圖片描述

💡 使用鼠標滾輪 操作雙向進度條

int numDegrees = event->delta() / 8;		// 滾動的角度,*8就是鼠標滾動的距離
int numSteps = numDegrees / 15;				// 滾動的步數,*15就是鼠標滾動的角度// numSteps即上下滾動的步數,體現到數值上是 1/-1。相關事件類:QWheelEvent

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QtWidgets>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;QProgressBar *lbar;QProgressBar *rbar;int lval;int rval;protected:void wheelEvent(QWheelEvent * event);
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->resize(600, 50);// 初始化兩個進度條lbar = new QProgressBar;rbar = new QProgressBar;// 為進度條設置默認值lbar->setValue(0);rbar->setValue(0);this->lval= 0;this->rval= 0;// 取消顯示進度條的百分比lbar->setTextVisible(false);rbar->setTextVisible(false);// 使進度條可以縱向拉伸lbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);rbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);// 翻轉左進度條lbar->setInvertedAppearance(true);// 添加進度條樣式,每個進度條中包含有 1px 的 border邊框// lbar->setStyleSheet(PROGRESS_LEFT_STYLE);// rbar->setStyleSheet(PROGRESS_RIGHT_STYLE);// 左右兩進度條橫向布局QHBoxLayout *box = new QHBoxLayout;box->addWidget(lbar);box->addWidget(rbar);box->setMargin(0);box->setSpacing(0);// 添加進度條兩側的空白,再次橫向布局QHBoxLayout *hbox = new QHBoxLayout;hbox->addStretch(1);hbox->addLayout(box, 28);hbox->addStretch(1);hbox->setMargin(0);hbox->setSpacing(0);// 添加進度條上下的空白,然后縱向布局QVBoxLayout *vbox = new QVBoxLayout(this);vbox->addStretch(1);vbox->addLayout(hbox, 5);vbox->addStretch(1);vbox->setMargin(0);vbox->setSpacing(0);
}void Widget::wheelEvent(QWheelEvent * event)
{int numDegrees = event->delta() / 8;int numSteps = numDegrees / 15;//    qDebug() << numDegrees << numSteps;       // ±15, ±1if (numDegrees < 0){if (this->rval < 0){this->rval = 0;this->lval += 10;if (this->lval >= 100)this->lval = 100;lbar->setValue(this->lval);qDebug() << "left: " << this->lval;}this->rval -= 10;rbar->setValue(this->rval);qDebug() << "right: " << this->rval;}else if (numDegrees > 0){if (this->lval < 0){this->lval = 0;this->rval += 10;if (this->rval >= 100)this->rval = 100;rbar->setValue(this->rval);qDebug() << "right: " << this->rval;}this->lval -= 10;lbar->setValue(this->lval);qDebug() << "left: " << this->lval;}else { }
}Widget::~Widget()
{delete ui;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209365.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java8 常用code

文章目錄 前言一、lambda1. 排序1.1 按照對象屬性排序&#xff1a;1.2 字符串List排序&#xff1a;1.3 數據庫排序jpa 2. 聚合2.1 基本聚合&#xff08;返回對象list&#xff09;2.2 多字段組合聚合&#xff08;直接返回對象list數量&#xff09; 二、基礎語法2.1 List2.1.1 數…

Holynix

信息收集階段 存活主機探測&#xff1a;arp-scan -l 當然了&#xff0c;正常來說我們不應該使用arp進行探測&#xff0c;arp探測的是arp的緩存表&#xff0c;我們應該利用nmap進行探測&#xff01; nmap -sT --min-rate 10000 192.168.182.0/24 端口探測 nmap -sT --min-rat…

Navicat 技術指引 | 適用于 GaussDB 分布式的調試器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

golang學習筆記——數據結構進階

文章目錄 數據結構進階mapmap示例sliceinterfaceembedded 數據結構進階 map map 讀取某個值時 - 返回結果可以為 value,bool 或者 value。注意后者&#xff0c;在key不存在時&#xff0c;會返回value對應類型的默認值map 的 range 方法需要注意 - key,value 或者 key。注意后…

【數據結構】單調棧與單調隊列算法總結

單調棧 知識概覽 單調棧最常見的應用是找到每一個數離它最近的且比它小的數。單調棧考慮的方式和雙指針類似&#xff0c;都是先想一下暴力做法是什么&#xff0c;然后再挖掘一些性質如單調性&#xff0c;最終可以把目光集中在比較少的狀態中&#xff0c;從而達到降低時間復雜…

業務設計原則

《億級流量網站架構核心技術》讀書筆記 一、防重設計 防重是通過在盡可能前端的位置阻擋請求重復執行&#xff0c;從而防止影響業務。它主要運用于“重復發生會造成業務影響”的場景。 請求本身可以發生多次&#xff0c;需要定義何為同一條業務數據。 分成業務本身允許多次和…

JS中call()、apply()、bind()改變this指向的原理

大家如果想了解改變this指向的方法&#xff0c;大家可以閱讀本人的這篇改變this指向的六種方法 大家有沒有想過這三種方法是如何改變this指向的&#xff1f;我們可以自己寫嗎&#xff1f; 答案是&#xff1a;可以自己寫的 讓我為大家介紹一下吧&#xff01; 1.call()方法的原理…

Python 語言在 Web 開發上有哪些應用框架?

Python 是一門多用途的編程語言&#xff0c;其簡潔、易讀且強大的特性使其成為Web開發領域的一種熱門選擇。Python Web開發框架提供了豐富的工具和功能&#xff0c;使得開發者能夠更高效地構建各種規模和類型的Web應用。以下是一些在Python Web開發中常用的框架&#xff0c;每個…

[mysql]linux安裝mysql5.7

之前安裝的時候遇到了很多問題&#xff0c;浪費了一些時間。整理出這份教程&#xff0c;照著做基本一遍過。 這是安裝包: 鏈接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下載安裝包&#xff0c;上傳到linux。我這里就放到downloads目錄下面…

WaitGroup原理分析

背景 在實際業務開發中&#xff0c;我們會遇到以下場景&#xff1a;請求數據庫&#xff0c;批量獲取1000條數據記錄后&#xff0c;處理數據 為了減少因一次批量獲取的數據太多&#xff0c;導致的數據庫延時增加&#xff0c;我們可以把一次請求拆分成多次請求&#xff0c;并發去…

C#-快速剖析文件和流,并使用

目錄 一、概述 二、文件系統 1、檢查驅動器信息 2、Path 3、文件和文件夾 三、流 1、FileStream 2、StreamWriter與StreamReader 3、BinaryWriter與BinaryReader 一、概述 文件&#xff0c;具有永久存儲及特定順序的字節組成的一個有序、具有名稱的集合&#xff1b; …

大模型的全方位評估

摘要&#xff1a; 評估通過提供一種跟蹤進度、理解模型以及記錄其能力和偏差的方法&#xff0c;為基礎大模型提供了背景。基礎大模型挑戰了機器學習中標準評估范式實現這些目標的能力&#xff0c;因為它們距離特定任務只有一步之遙。為了設想適合基礎模型的評估新范式&#xff…

枚舉 LeetCode2048. 下一個更大的數值平衡數

如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數 。 如果n的位數是k&#xff0c;n它的下一個大的平衡數一定不會超過 k1個k1…

圖論——最小生成樹

圖論——最小生成樹 A wise man changes his mind, a fool never will 生成樹 一個連通圖的生成樹是一個極小的連通子圖&#xff0c;它包含圖中全部的n個頂點&#xff0c;但只有構成一棵樹的n-1條邊。 最小生成樹 在這些邊中選擇N-1條出來&#xff0c;連接所有的N個點。這N-1…

Java后端的登錄、注冊接口是怎么實現的

目錄 Java后端的登錄、注冊接口是怎么實現的 Java后端的登錄接口是怎么實現的 Java后端的注冊接口怎么實現&#xff1f; 如何防止SQL注入攻擊&#xff1f; Java后端的登錄、注冊接口是怎么實現的 Java后端的登錄接口是怎么實現的 Java后端的登錄接口的實現方式有很多種&a…

使用git出現的問題

保證 首先保證自己的git已經下載 其次保證自己的gitee賬號已經安裝并且已經生成ssh公鑰 保證自己要push的代碼在要上傳的文件夾內并且配置文件等都在父文件夾&#xff08;也就是文件沒有套著文件&#xff09; 問題 1 $ git push origin master gitgitee.com: Permission de…

近似同態加密的 IND/SIM-CPA+ 安全性:對于 CKKS 實際有效的攻擊

參考文獻&#xff1a; [LM21] Li B, Micciancio D. On the security of homomorphic encryption on approximate numbers[C]//Advances in Cryptology–EUROCRYPT 2021: 40th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Z…

【Linux】命令expect使用詳解

&#x1f984; 個人主頁——&#x1f390;個人主頁 &#x1f390;?&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感謝點贊和關注 &#xff0c;每天進步一點點&#xff01;加油&#xff01;&…

【上海大學數字邏輯實驗報告】五、記憶元件測試

一、實驗目的 掌握R-S觸發器、D觸發器和JK觸發器的工作原理及其相互轉換。學會用74LS00芯片構成鐘控RS觸發器。學會用74LS112實現D觸發器學會在Quartus II上用D觸發器實現JK觸發器。 二、實驗原理 基本R-S觸發器是直接復位-置位的觸發器&#xff0c;它是構成各種功能的觸發器…

AI文檔助手,當下熱門的AI文檔助手【2024】

在當今信息爆炸的時代&#xff0c;文檔創作的需求愈發龐大。為了滿足用戶對高效、準確、原創性文檔的需求&#xff0c;人工智能技術的應用日益廣泛。本文將專心分享AI文檔助手領域的熱門推薦。 AI文檔助手的背景與應用 AI文檔助手作為人工智能技術在文檔創作領域的一大應用&am…