//雖然下面一行代碼進行widget和ui的窗口關聯,但是如果發生窗口大小變化的時候,里面的布局不會隨之變化ui->setupUi(this);//通過下面這行代碼進行顯示說明,讓窗口變化時,布局及其子控件隨之變化this->setLayout(ui->verticalLayout);
信號與槽
在構造函數中進行信號與槽得綁定 有四種方式
①在ui界面 直接右鍵選擇轉到槽 在代碼中會自動生成一個函數??
//第一種方式 通過UIDesigner
void Widget::on_pushButton_clicked()
{std:: cout << "pushButtonClicked" << std::endl;
}
②使用connect直接進行編碼?
// 第二種方式 QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));QObject::connect(ui->qbjcon,SIGNAL(clicked()),this,SLOT(on_qbjcon_clickedMyself()));void Widget::on_qbjcon_clickedMyself()
{std:: cout << "qbjconClicked" << std::endl;
}
③ 使用lamda表達式進行編碼 這個方式無需再去構造函數
//第三種方式Lamda表達式 QObject::connect(sender,&SIGNAL::signal,[=](){/* lamdda body */});QObject::connect(ui->btnlamda,&QPushButton::clicked,[=](){std:: cout << "btnlamdaClicked" << std::endl;});
④?
//第四種方式: Qobject::connect(sender,&Sender::signal,receiver,&Receiver::slot);QObject::connect(ui->btnfor,&QPushButton::clicked,this,&Widget::on_for_clicked);
}void Widget::on_for_clicked()
{std:: cout << "forClicked" << std::endl;
}
自定義信號與槽
signals:void mysignal();void mysignalparams(int value);
private slots:void myslot();void myslotparams(int value);
connect(this,SIGNAL(mysignal()),this,SLOT(myslot())); //第一個誰來發 第二個信號 第三個誰來收 第四個槽connect(this,SIGNAL(mysignalparams(int)),this,SLOT(myslotparams(int)));emit mysignal(); //觸發信號emit mysignalparams(100);
void Widget::myslot()
{std::cout << "myslot" << std :: endl ;
}void Widget::myslotparams(int value)
{std::cout << "myslotparams" << std :: endl ;std::cout << value << std::endl;
}
QDebug()
QDebug 是QT中用于輸出調試信息的一個類,它提供了一種方便的方式來輸出文本到標準輸出,這對于調試QT應用程序非常有用。
文件選擇對話框QFileDialog
QFilelog 開發流程
QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"),"D:/QT/",tr("Images(*.png *.xpm *.jpg)")); //第二個參數是打開文件 第三個參數是默認打開文件的路徑 第四個參數是限制的后綴
qDebug() << fileName;
下面是wigget.cpp文件
#include "widget.h"
#include "ui_widget.h"#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <QShortcut>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{//雖然下面一行代碼進行widget和ui的窗口關聯,但是如果發生窗口大小變化的時候,里面的布局不會隨之變化ui->setupUi(this);QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),this);QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")),this);QShortcut *shortcutZoomIn = new QShortcut(QKeySequence(tr("Ctrl+Shift+=", "File|Save")),this);QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Save")),this);connect(shortcutOpen,&QShortcut::activated,[=](){on_btnopen_clicked();});connect(shortcutSave,&QShortcut::activated,[=](){on_btnsave_clicked();});connect(shortcutZoomIn,&QShortcut::activated,[=](){zoomIn();});connect(shortcutZoomOut,&QShortcut::activated,[=](){zoomOut();});//通過下面這行代碼進行顯示說明,讓窗口變化時,布局及其子控件隨之變化this->setLayout(ui->verticalLayout);//ui->widgetbottom->setLayout(ui->horizontalLayout);connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)));connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionchanged()));
}Widget::~Widget()
{delete ui;
}void Widget::zoomIn()
{//獲得當前TextEdit的當前字體的信息QFont font=ui->textEdit->font();//獲得當前字體的大小int fontSize =font.pointSize();if(fontSize == -1) return;//改變大小,并設置字體大小int newFontSize =fontSize +1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}void Widget::zoomOut()
{//獲得當前TextEdit的當前字體的信息QFont font=ui->textEdit->font();//獲得當前字體的大小int fontSize =font.pointSize();if(fontSize == -1) return;//改變大小,并設置字體大小int newFontSize =fontSize -1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}/*打開文件*/
void Widget::on_btnopen_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"),"D:/QT/",tr("Text(*.txt)")); //第二個參數是打開文件 第三個參數是默認打開文件的路徑 第四個參數是限制的后綴ui->textEdit->clear(); // 再打開之后將現有的文本清空//打開文件file.setFileName(fileName); //或者 QFile file(); 盡量使用這種方式file.setFileName(D:\Qt\text1.txt);if(!file.open(QIODevice::ReadWrite | QIODevice::Text)){qDebug() << "file open error!" ;}this->setWindowTitle(fileName+" - MyNoteBook");//讀取文件QTextStream in(&file);//in.setCodec("UTF-8");//in.setCodec("ANSI");QString str =ui->comboBox->currentText();const char *c_str = str.toStdString().c_str(); //把QString 轉化為charin.setCodec(c_str); //這里面需要char型 因此需要轉化 ui->comboBox->currentText() 為QString型//方式1 QString context = in.read(file.size());//方式2 主要是讀取大型的文件while(!in.atEnd()){QString context = in.readLine(); //逐行讀取//輸出文件內容//ui->textEdit->setText(context); //settext輸出有弊端 當文本很多時 很難輸出文本ui->textEdit->append(context); //append能夠將現有的讀出來 后面的追加}}void Widget::on_btnsave_clicked()
{if(!file.isOpen()){QString fileName = QFileDialog::getSaveFileName(this,tr("Save File"),"D:/QT/untitled.txt",tr("Text(*.txt *.doc)")); //第二個參數是打開文件 第三個參數是默認打開文件的路徑 第四個參數是限制的后綴//1.打開file.setFileName(fileName); //或者 QFile file(); file.setFileName(D:\Qt\text1.txt);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug() << "file open error";}this->setWindowTitle(fileName+" - MyNoteBook");}//2.寫入QTextStream out(&file);file.seek(0); // 移動到文件頭out.setCodec(ui->comboBox->currentText().toStdString().c_str());QString context = ui->textEdit->toPlainText();out << context;}void Widget::on_btnClose_clicked()
{QMessageBox msgBox; //Qt當中的彈窗int ret = QMessageBox::warning(this, tr("MyNotebook Notice:"),tr("The document has been modified.\n""Do you want to save your changes?"),QMessageBox::Save | QMessageBox::Discard| QMessageBox::Cancel,QMessageBox::Save);switch (ret) {case QMessageBox::Save:// Save was clickedon_btnsave_clicked();qDebug() << "QMessageBox::Save:" ;break;case QMessageBox::Discard:// Don't Save was clickedui->textEdit->clear();file.close();this->setWindowTitle("MyNoteBook");qDebug() << "QMessageBox::Discard:" ;break;case QMessageBox::Cancel:// Cancel was clickedqDebug() << "QMessageBox::Cancel:" ;break;default:// should never be reachedbreak;}}void Widget::onCurrentIndexChanged(int)
{qDebug() << "currentItSigal" ;ui->textEdit->clear();if(file.isOpen()){qDebug() << "file is Open" ;QTextStream in(&file);in.setCodec(ui->comboBox->currentText().toStdString().c_str()); //這里面需要char型 因此需要轉化 ui->comboBox->currentText() 為QString型file.seek(0); //重新讓光標回到原處while(!in.atEnd()){QString context = in.readLine(); //逐行讀取//ui->textEdit->setText(context); //settext輸出有弊端 當文本很多時 很難輸出文本ui->textEdit->append(context); //append能夠將現有的讀出來 后面的追加}}
}void Widget::onCursorPositionchanged()
{QTextCursor cursor = ui->textEdit->textCursor();//qDebug() << cursor.blockNumber()+1 <<","<< cursor.columnNumber()+1 ;QString blockNum =QString::number(cursor.blockNumber()+1);QString columNum =QString::number(cursor.columnNumber()+1);const QString labelMes ="L:" +blockNum +",C:"+ columNum+" ";ui->labelPosition->setText(labelMes);//設置當前行高亮QList<QTextEdit::ExtraSelection>extraSelections;QTextEdit::ExtraSelection ext;//1.知道當前行ext.cursor = ui->textEdit->textCursor();//2.顏色QBrush qBrush(Qt::lightGray);ext.format.setBackground(qBrush);//配置段屬性,整行顯示ext.format.setProperty(QTextFormat::FullWidthSelection,true);//3.設置//把ext加到ext容器中extraSelections.append(ext);ui->textEdit->setExtraSelections(extraSelections);}
下面是wigget.h文件
#ifndef WIDGET_H
#define WIDGET_H#include <QFile>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:QFile file;Widget(QWidget *parent = nullptr);~Widget();void zoomIn();void zoomOut();private slots:void on_btnopen_clicked();void on_btnsave_clicked();void on_btnClose_clicked();void onCurrentIndexChanged(int index);void onCursorPositionchanged();private:Ui::Widget *ui;
};
#endif // WIDGET_H
最終實現的效果如圖