C++ GUI Qt4编写的文本编辑器
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMenu>
#include <QAction>
#include <QFont>
#include <QToolBar>
#include <QLabel>
#include <QComboBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QPrinter>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QActionGroup>
#include <QPrintDialog>
#include <QPushButton>
#include <QToolButton>
#include <QTextStream>
#include <QMessageBox>
#include <QTextCodec>
#include <QMainWindow>
#include <QFileDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QFontDatabase>
#include <QFontComboBox>
#include <QColorDialog> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
void createAction();
void createMenu();
void createToolBar();
void fileRead();//读文件
void fileWrite();//写文件
~MainWindow(); public:
Ui::MainWindow *ui;
QMenu *file;
QMenu *edit;
QMenu *style;
QMenu *insert;//插入菜单
QMenu *search;//查找菜单
QMenu *help;//帮助菜单 QToolBar *fileToolBar;
QToolBar *editToolBar;
QToolBar *styleToolBar;
QToolBar *insertToolBar;
QToolBar *searchToolBar;
QToolBar *helpToolBar; QTextEdit *textEdit; QAction *newFile;
QAction *openFile;
QAction *save;
QAction *saveAs;
QAction *printText;
QAction *exit; QAction *undoAction;//撤销
QAction *redoAction;//恢复
QAction *copy;
QAction *cut;
QAction *paste; QAction *insertImg;
QAction *insertTable; QAction *find; QAction *about;
QAction *aboutQt; QAction *bold;
QAction *italic;
QAction *underLine;
QAction *color; QAction *left;
QAction *center;
QAction *right;
QAction *justify;
QActionGroup *group; QLabel *fontLabel;
QLabel *fontSizeLabel;
QFontComboBox *fontCom;
QComboBox *fontSizeCom; QString fileName; QLineEdit *lineEdit;
QLabel *label;
QPushButton *btn;
QVBoxLayout *layout; QLineEdit *column;
QLineEdit *row; private slots:
void findNext(); void NewFile();
void OpenFile();
void Save();
void SaveAs();
void Color();
void Bold();
void Italic();
void UnderLine();
void ALignment(QAction *);
void PrintText();
void InsertImage();
void InsertTable();
void mergeFormat(QTextCharFormat);
void FontComBox(QString fontComStr);
void FontSizeCom(QString fontSizeStr);
void Find();
void About();
void AboutQt();
void showCurrentCharFormatChanged(const QTextCharFormat &form); };
mainwindow.cpp:
#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);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
setWindowIcon(QIcon(":/images/textEditor.png"));
setWindowTitle(tr("Qt文本编辑器"));
textEdit = new QTextEdit();
setCentralWidget(textEdit);
createAction();//创建动作
createMenu();//创建菜单
createToolBar();//创建工具栏 //文件菜单的动作与槽的连接
connect(newFile,SIGNAL(triggered()),this,SLOT(NewFile()));
connect(openFile,SIGNAL(triggered()),this,SLOT(OpenFile()));
connect(save,SIGNAL(triggered()),this,SLOT(Save()));
connect(saveAs,SIGNAL(triggered()),this,SLOT(SaveAs()));
connect(exit,SIGNAL(triggered()),this,SLOT(close()));
//编辑菜单的动作与槽的连接
connect(cut,SIGNAL(triggered()),textEdit,SLOT(cut()));
connect(copy,SIGNAL(triggered()),textEdit,SLOT(copy()));
connect(paste,SIGNAL(triggered()),textEdit,SLOT(paste()));
connect(undoAction,SIGNAL(triggered()),textEdit,SLOT(undo()));
connect(redoAction,SIGNAL(triggered()),textEdit,SLOT(redo()));
//字体设置动作与槽的连接
connect(fontCom,SIGNAL(activated(QString)),this,
SLOT(FontComBox(QString)));
//字号设置动作与槽的连接
connect(fontSizeCom,SIGNAL(activated(QString)),this,SLOT(FontSizeCom(QString))); connect(textEdit,SIGNAL(currentCharFormatChanged(QTextCharFormat&)),
this,SLOT(showCurrentCharFormatChanged(QTextCharFormat&))); //颜色编辑动作与槽的连接
connect(color,SIGNAL(triggered()),this,SLOT(Color()));
//格式菜单动作与槽的连接
connect(bold,SIGNAL(triggered()),this,SLOT(Bold()));
connect(italic,SIGNAL(triggered()),this,SLOT(Italic()));
connect(underLine,SIGNAL(triggered()),this,SLOT(UnderLine())); connect(group,SIGNAL(triggered(QAction*)),this,SLOT(ALignment(QAction *)));
//插入菜单动作与槽的连接
connect(insertImg,SIGNAL(triggered()),this,SLOT(InsertImage()));
connect(insertTable,SIGNAL(triggered()),this,SLOT(InsertTable()));
//打印动作与槽的连接
connect(printText,SIGNAL(triggered()),this,SLOT(PrintText()));
//查找菜单动作与槽的连接
connect(find,SIGNAL(triggered()),this,SLOT(Find())); connect(about,SIGNAL(triggered()),this,SLOT(About()));
connect(aboutQt,SIGNAL(triggered()),this,SLOT(AboutQt()));
resize(,);
} //创建动作 void MainWindow::createAction(){
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//新建文件
newFile = new QAction(QIcon(":/images/new.png"),tr("新建文件"),this);
newFile->setShortcut(tr("Ctrl+N"));
newFile->setStatusTip(tr("新建一个文件"));
//打开文件
openFile = new QAction(QIcon(":/images/open.png"),tr("打开文件"),this);
openFile->setShortcut(tr("Ctrl+O"));
openFile->setStatusTip(tr("打开一个文件"));
//保存文件
save = new QAction(QIcon(":/images/save.png"),tr("保存"),this);
save->setShortcut(tr("Ctrl+S"));
save->setStatusTip(tr("保存文件"));
//另存为
saveAs = new QAction(QIcon(":/images/saveAs.png"),tr("另存为"),this);
saveAs->setShortcut(tr("Ctrl+A"));
saveAs->setStatusTip(tr("文件另存为"));
//打印
printText = new QAction(QIcon(":/images/printText.png"),tr("打印"),this);
printText->setShortcut(tr("Ctrl+P"));
printText->setStatusTip(tr("打印"));
//退出
exit = new QAction(QIcon(":/images/exit.png"),tr("退出"),this);
exit->setShortcut(tr("Ctrl+E"));
exit->setStatusTip(tr("退出"));
//恢复
redoAction = new QAction(QIcon(":/images/redo.png"),tr("恢复"),this);
redoAction->setShortcut(tr("Ctrl+R"));
redoAction->setStatusTip(tr("恢复"));
//撤销
undoAction = new QAction(QIcon(":/images/undo.png"),tr("撤销"),this);
undoAction->setShortcut(tr("Ctrl+U"));
undoAction->setStatusTip(tr("撤销"));
//剪切
cut = new QAction(QIcon(":/images/cut.png"),tr("剪切"),this);
cut->setShortcut(tr("Ctrl+X"));
cut->setStatusTip(tr("剪切"));
//复制
copy = new QAction(QIcon(":/images/copy.png"),tr("复制"),this);
copy->setShortcut(tr("Ctrl+C"));
copy->setStatusTip(tr("复制"));
//粘贴
paste = new QAction(QIcon(":/images/paste.png"),tr("黏贴"),this);
paste->setShortcut(tr("Ctrl+P"));
paste->setStatusTip(tr("粘贴")); //粗体
bold = new QAction(QIcon(":/images/bold.png"),tr("粗体"),this);
bold->setStatusTip(tr("粗体字"));
bold->setCheckable(true);
//斜体
italic = new QAction(QIcon(":/images/italic.png"),tr("斜体"),this);
italic->setStatusTip(tr("斜体字"));
italic->setCheckable(true);
//下划线
underLine = new QAction(QIcon(":/images/underline.png"),tr("下划线"),this);
underLine->setStatusTip(tr("下划线"));
underLine->setCheckable(true);
//颜色
color = new QAction(QIcon(":/images/color.png"),tr("颜色"),this);
color->setShortcut(tr("Ctrl+C"));
color->setStatusTip(tr("颜色编辑")); group = new QActionGroup(this);
//左对齐
left = new QAction(QIcon(":/images/left.png"),tr("左对齐"),group);
left->setStatusTip(tr("左对齐"));
left->setCheckable(true);
//居中
center = new QAction(QIcon(":/images/center.png"),tr("居中对齐"),group);
center->setStatusTip(tr("居中对齐"));
center->setCheckable(true);
//右对齐
right = new QAction(QIcon(":/images/right.png"),tr("右对齐"),group);
right->setStatusTip(tr("右对齐"));
right->setCheckable(true);
//两端对齐
justify = new QAction(QIcon(":/images/justify.png"),tr("两端对齐"),group);
justify->setStatusTip(tr("两端对齐"));
justify->setCheckable(true); group->addAction(left);
group->addAction(center);
group->addAction(right);
group->addAction(justify);
//插入图片
insertImg = new QAction(QIcon(":/images/image.png"),tr("插入图片"),this);
insertImg->setStatusTip(tr("插入图片"));
//插入表格
insertTable = new QAction(QIcon(":/images/table.png"),tr("插入表格"),this);
insertTable->setStatusTip(tr("插入表格"));
//查找
find = new QAction(QIcon(":/images/find.png"),tr("查找"),this);
find->setShortcut(tr("Ctrl+F"));
find->setStatusTip(tr("查找"));
//关于
about = new QAction(QIcon(":/images/about.png"),tr("关于"),this);
about->setStatusTip(tr("关于")); //字体
fontLabel = new QLabel(tr("字体"));
fontCom = new QFontComboBox();
fontCom->setFontFilters(QFontComboBox::ScalableFonts);
fontCom->setStatusTip(tr("字体设置"));
//字号
fontSizeLabel = new QLabel(tr("字号"));
QFontDatabase db;
fontSizeCom = new QComboBox();
foreach(int size,db.standardSizes())
fontSizeCom->addItem(QString::number(size));
fontSizeCom->setStatusTip(tr("字号设置"));
//关于
aboutQt = new QAction(tr("关于QT"),this);
aboutQt->setStatusTip(tr("关于Qt")); } //创建菜单
void MainWindow::createMenu(){
//文件菜单
file = menuBar()->addMenu(tr("文件(&F)"));
file->addAction(newFile);
file->addAction(openFile);
file->addSeparator();
file->addAction(save);
file->addAction(saveAs);
file->addSeparator();
file->addAction(printText);
file->addSeparator();
file->addAction(exit);
//编辑菜单
edit = menuBar()->addMenu(tr("编辑(&E)"));
edit->addAction(undoAction);
edit->addAction(redoAction);
edit->addSeparator();
edit->addAction(cut);
edit->addAction(copy);
edit->addAction(paste);
//插入菜单
insert = menuBar()->addMenu(tr("插入(&I)"));
insert->addAction(insertImg);
insert->addAction(insertTable);
//查找菜单
search = menuBar()->addMenu(tr("查找(&F)"));
search->addAction(find);
//格式菜单 style = menuBar()->addMenu(tr("格式(&S)"));
style->addAction(bold);
style->addAction(italic);
style->addAction(underLine);
style->addSeparator();
style->addAction(color);
style->addSeparator();
style->addAction(left);
style->addAction(center);
style->addAction(right);
style->addAction(justify);
//帮助菜单
help = menuBar()->addMenu(tr("帮助(&H)"));
help->addAction(about);
help->addAction(aboutQt); }
//创建工具栏
void MainWindow::createToolBar(){
//文件
fileToolBar = addToolBar(tr("文件(&N)"));
fileToolBar->addAction(newFile);
fileToolBar->addAction(openFile);
fileToolBar->addSeparator(); fileToolBar->addAction(save);
fileToolBar->addAction(saveAs);
fileToolBar->addSeparator(); fileToolBar->addAction(printText);
fileToolBar->addSeparator();
//编辑
editToolBar = addToolBar(tr("编辑(&E)"));
editToolBar->addAction(undoAction);
editToolBar->addAction(redoAction);
editToolBar->addSeparator();
editToolBar->addAction(cut);
editToolBar->addAction(copy);
editToolBar->addAction(paste);
//格式
styleToolBar = addToolBar(tr("格式(&S)"));
styleToolBar->addAction(bold);
styleToolBar->addAction(italic);
styleToolBar->addAction(underLine);
styleToolBar->addSeparator(); styleToolBar->addAction(left);
styleToolBar->addAction(center);
styleToolBar->addAction(right);
styleToolBar->addAction(justify);
styleToolBar->addSeparator(); styleToolBar->addWidget(fontLabel);
styleToolBar->addWidget(fontCom);
styleToolBar->addWidget(fontSizeLabel);
styleToolBar->addWidget(fontSizeCom);
//插入
insertToolBar = addToolBar(tr("插入(&I)"));
insertToolBar->addAction(insertImg);
insertToolBar->addAction(insertTable);
insertToolBar->addSeparator();
//查找
searchToolBar = addToolBar(tr("查找(&F)"));
searchToolBar->addAction(find);
search->addSeparator();
} //封装的读文件,用于精简程序
void MainWindow::fileRead(){
QFile file(fileName);
if(!file.open(QFile::ReadOnly|QFile::Text)){
QMessageBox::warning(this,tr("多文档编辑器"),
tr("不可以打开文件%1:\n%2").arg(fileName).arg(file.errorString()));
return;
}
QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor();
}
//封装的写文件,用于精简程序
void MainWindow::fileWrite(){
QFile file(fileName); if(!file.open(QFile::WriteOnly|QFile::Text)){
QMessageBox::warning(this,tr("多文档编辑器"),
tr("不可以写入文件%1:/n%2").arg(fileName).arg(file.errorString()));
return;
} QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
out<<textEdit->toPlainText();
QApplication::restoreOverrideCursor();
return;
}
//新建文件
void MainWindow::NewFile(){
MainWindow *newEdit = new MainWindow;
newEdit->show();
}
//打开文件
void MainWindow::OpenFile(){
fileName = QFileDialog::getOpenFileName(this,tr("打开文件"),"/","allFile(*.*)");
if(!fileName.isEmpty()){ if(textEdit->document()->isEmpty()){
fileRead();
}else{
MainWindow *newEdit = new MainWindow;
newEdit->show();
QFile file(fileName);
if(!file.open(QFile::ReadOnly|QFile::Text)){
QMessageBox::warning(this,tr("多文档编辑器"),
tr("不可以打开文件%1:\n%2").arg(fileName).arg(file.errorString()));
return;
}
QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
newEdit->textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor(); } }
}
//保存文件
void MainWindow::Save(){ if(fileName.isEmpty()){
fileName = QFileDialog::getSaveFileName(this,tr("另存为"),tr("未命名.txt"));
fileWrite();
}else{
fileWrite();
} }
//另存为
void MainWindow::SaveAs(){ fileName = QFileDialog::getSaveFileName(this,tr("另存为"),tr("未命名.txt"));
fileWrite();
} //字体设置
void MainWindow::FontComBox(QString fontComStr){
QTextCharFormat format;
format.setFontFamily(fontComStr);
mergeFormat(format);
}
void MainWindow::mergeFormat(QTextCharFormat format){
QTextCursor cursor = textEdit->textCursor();
if(!cursor.hasSelection())
cursor.select(QTextCursor::WordUnderCursor);
cursor.mergeCharFormat(format);
textEdit->mergeCurrentCharFormat(format); }
//字号设置
void MainWindow::FontSizeCom(QString fontSizeStr){
QTextCharFormat format;
format.setFontPointSize(fontSizeStr.toFloat());
textEdit->mergeCurrentCharFormat(format);
} //颜色设置
void MainWindow::Color(){
QColor color = QColorDialog::getColor(Qt::blue,this);
if(color.isValid()){
QTextCharFormat format;
format.setForeground(color);
textEdit->mergeCurrentCharFormat(format);
}
}
//粗体
void MainWindow::Bold(){
QTextCharFormat format;
format.setFontWeight(bold->isChecked()?QFont::Bold:QFont::Normal);
textEdit->mergeCurrentCharFormat(format);
}
//斜体
void MainWindow::Italic(){
QTextCharFormat format;
format.setFontItalic(italic->isChecked());
textEdit->mergeCurrentCharFormat(format); }
//下划线
void MainWindow::UnderLine(){ QTextCharFormat format;
format.setFontUnderline(underLine->isChecked());
textEdit->mergeCurrentCharFormat(format);
}
//对齐
void MainWindow::ALignment(QAction *act){
if(act == left){
textEdit->setAlignment(Qt::AlignLeft);
}else if(act == center){
textEdit->setAlignment(Qt::AlignCenter);
}else if(act == right){
textEdit->setAlignment(Qt::AlignRight);
}else if(act == justify){
textEdit->setAlignment(Qt::AlignJustify);
} } //插入图片
void MainWindow::InsertImage(){ QTextCursor cursor = textEdit->textCursor();
QTextImageFormat format;
QString image = QFileDialog::getOpenFileName(this,"insert image","/","png(*.png)");
format.setName(image);
cursor.insertImage(format); } //插入表格,用到输入对话框
void MainWindow::InsertTable(){
bool ok;
int a = QInputDialog::getInt(this,tr("插入表格"),tr("输入行数:"),,,,,&ok);
int b = QInputDialog::getInt(this,tr("插入表格"),tr("输入列数:"),,,,,&ok);
if(ok){ QTextCursor cursor = textEdit->textCursor(); QTextTableFormat format;
format.setCellSpacing();
format.setCellPadding(); cursor.insertTable(a,b,format); }
} //查找
void MainWindow::Find(){
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle(tr("查找"));
lineEdit = new QLineEdit(dialog);
label = new QLabel(this);
btn = new QPushButton(dialog);
btn->setText(tr("下一个"));
connect(btn,SIGNAL(clicked()),this,SLOT(findNext())); layout = new QVBoxLayout();
layout->addWidget(lineEdit);
layout->addWidget(btn);
dialog->setLayout(layout);
dialog->resize(,);
dialog->show(); } void MainWindow::findNext(){ QString str = lineEdit->text(); bool isfind = textEdit->find(str,QTextDocument::FindBackward); if(isfind){
label->setText(tr("查找目标在,行号:%1 列号:%2!").arg(textEdit->textCursor().blockNumber()).arg(textEdit->textCursor().columnNumber()));
ui->statusBar->addPermanentWidget(label);
} }
//打印
void MainWindow::PrintText(){
QPrinter printer;
QPrintDialog printDialog(&printer,this);
if(printDialog.exec()){
QTextDocument *textDocument = textEdit->document();
textDocument->print(&printer);
}
} //帮助 void MainWindow::About(){
QMessageBox::about(this,tr("关于"),tr("这是一个文本编辑器")); } void MainWindow::AboutQt(){
QMessageBox::aboutQt(this,tr("Qt编辑器"));
} void MainWindow::showCurrentCharFormatChanged(const QTextCharFormat &form){ fontCom->setCurrentIndex(fontCom->findText(form.fontFamily()));
fontSizeCom->setCurrentIndex(fontSizeCom->findText(QString::number(form.fontPointSize())));
bold->setChecked(form.font().bold());
italic->setChecked(form.font().italic());
underLine->setChecked(form.font().underline());
} MainWindow::~MainWindow()
{
delete ui;
}
main.cpp:
#include <QApplication>
#include "mainwindow.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}
C++ GUI Qt4编写的文本编辑器的更多相关文章
- Java编写的文本编辑器(菜鸟作品)
//这是主窗体文件 Wordwin.java import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.sw ...
- Python GUI文本编辑器
使用Python编写一个简单的文本编辑器,需要展示一个用户界面,功能包括打开.保存文本文件. 使用tkinter库来编写GUI. #简单GUI文本编辑器 from tkinter import * f ...
- 170509、文本编辑器编写的shell脚本在linux下无法执行的解决方法
今天碰到一个奇怪的问题,编写好的shell脚本再linux上执行一直提示找不到文件或目录,后来想想是文本编辑器的问题,记录下来!!! 1.查看当前文本格式 Notepad++界面中,在右下角有文件格式 ...
- 假期作业02:安装JDK与文本编辑器并编写第一个Java程序
假期作业02:安装JDK与文本编辑器并编写第一个Java程序 一.安装JDK与文本编辑器并编写第一个java程序 首先在oracle官网(需要创建账号,进行登录后方可使用)按照自己的需求下载JDK(h ...
- JS编写自己的富文本编辑器
富文本编辑器,网上有很多功能齐全种类丰富的如百度的Ueditor,简单适用型的如WangEditor等等.在经过一番挑选后,我发现都不适用现在的项目,然后决定自己造轮子玩玩.富文本编辑器中主要涉及到J ...
- tinymce 富文本编辑器 编写资料
tinymce官方文档: 粘贴图片插件 博客搬运地址 使用Blob获取图片并二进制显示实例页面 tinymce自动调整插件 是时候掌握一个富文本编辑器了——TinyMCE(1) XMLHttpRequ ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...
- 最优秀的5个Linux文本编辑器
from: http://article.yeeyan.org/view/169956/174836 作为不久前举办的比赛的一部分内容,我从那些选出他们最喜欢的Linux文本编辑器的极客读者们那获得了 ...
- 如何评价 GitHub 发布的文本编辑器 Atom?
这里是HN上的讨论:GitHub's new text editor leaked on Twitter这里是github page:Atom · GitHub 好多repo啊我不知道有没有知友了解更 ...
随机推荐
- Spring ProxyFactory
ProxyFactory 是 Spring AOP的实现方式之一.下面介绍下ProxyFactory的用法. 1.接口定义 public interface UserReadService { pub ...
- 关于 mysql.test 数据库
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 【转】C++及java在内存分配上的区别
转自:http://blog.csdn.net/qinghezhen/article/details/9116053 C++内存分配由五个部分组成:栈.堆.全局代码区.常量区.程序代码区.如下图所示: ...
- poj 3984 迷宫问题 bfs
学会这道水题之后我懂得了不少哈,首先水题也能学到不少知识,尤其像我这样刚入门的小菜鸟,能学到一些小技巧. 然后就是可以从别人的代码里学到不一样的思路和想法. 这题就是求最短的路径,首先想到就是用bfs ...
- C 双向链表
单链表的结点都只有一个指向下一个结点的指针 单链表的数据元素无法直接访问其前驱元素 逆序访问单链表中的元素是极其耗时的操作! len = LinkList_Length(list); for (i=l ...
- window.external.notify() 与 UglifyJS 压缩优化冲突
近期研究了一下 UglifyJs 对 JS 代码的压缩,发现 UglifyJS 压缩后,无法调用 window.external.notify() 方法,JS 代码如下: function MyNot ...
- 【转】SQL Server 2012 配置AlwaysOn(三)
转载自:http://www.cnblogs.com/lyhabc/p/4682986.html 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http:/ ...
- JavaScript总结2--函数
一.定义函数 在js中,函数也是对象,能赋值给变量,能当作参数,可以设置属性,和调用他拥有的方法.函数的toString()方法,会返回他完整的函数内容.他有两个定义方法,函数表达式和函数声明.当一个 ...
- 用happen-before规则重新审视DCL(转载)
编写Java多线程程序一直以来都是一件十分困难的事,多线程程序的bug很难测试,DCL(Double Check Lock)就是一个典型,因此对多线程安全的理论分析就显得十分重要,当然这决不是说对多线 ...
- MSP430电平转换
说道到这个电平转换,写程序的时候居然还要示波器来观察现象,表示我们交的是211的学费,上的却不是211大学,创新实验室的仪器设备真的是少的可怜啊,我级不吐槽了说说这个电平转换的一些知识还有看法吧.. ...