代码:http://download.csdn.net/detail/zju_fish1996/9608840

        像素画,是以像素为基本单位进行绘制的画。同时,它也是一种设计风格,常用于图标(ICon)设计、logo设计、表情设计以及经典像素风游戏设计。像素画的绘制上手比较容易,对创作者最基本的要求是对色彩的把握,如明度对比、纯度对比。因为在像素画中,具体的线条概念可以是不明确的,而更多是由色彩来表达形体的。

        开发这款工具的初衷,就是为了方便以后的设计。当然市面上也有类似的产品了,但是很多都不是免费的(当然本来也没有多少设计软件是免费的),我感觉它本身的实现并不难,所以就花了一点时间来自己动手写它。

        现在的功能还不那么完善,但是最基本的功能已经实现了,包括这款工具的所有图标都是用它自身绘制出来的。




代码框架

        

        button.h :  

            继承自QToolButton, 在其基础上添加了一些函数。主要用于改变按钮样式。

        colorbar.h:  

             实现渐变的颜色条,继承自QWidget, 颜色改变后,可向画板、颜色面板发出信号通知它们修改颜色。

        colorwindow.h:
            实现颜色选择面板,继承自QWidget, 除了给定颜色,还可以在颜色对话框中选择新颜色。
         newdialog.h:
            实现新建文件时的对话框,继承自QWidget。
         paint.h:
            实现画板,完成所有绘制,继承自QWidget。
         savedialog.h:
           实现保存文件时的对话框,继承自QWidget。
         pixel.h:
            主界面,继承自QObject。包含了工具栏、菜单栏、图像栏的设计,以及所有控件的布局,以及它们之间的通信。

功能介绍


        新建文件时,可以自定义窗口大小,考虑到性能问题,暂时只支持150X150以下的图像。

        


        同样,可以加载一般的图片,但是大小也限制在150X150以下。

        保存文件时,可以保存为原始大小,也提供了放大为原来的4倍,9倍的选项,放大图像采用了简单的重复进行上采样。
        在这里确实可以设计更多的选项,包括利用插值的上采样,以及更多的放大倍数,在这里由于时间关系没有进一步扩展,但是图像还可以在设计软件如ps中进行进一步加工。
        

        绘制方面,提供了单个像素点、矩形、圆形的绘制,另外,还提供了取色器、橡皮擦、油漆桶。
        一开始的时候,只打算提供单一像素的绘制,但是后来考虑了一下,又加上了矩形和圆形,更多的体素暂时没有完成。
        橡皮擦目前只支持擦除一个像素点,为了方便自己的使用,后续的维护过程中应该会陆续加上更多的功能。
        此外,可以撤销,也可以重做(最多支持30步),可以选择显示网格与否。

        
       
        颜色板中,除了自己摆的几个颜色外,还使用了qt内置的颜色对话框,可以选择丰富的颜色。
        此外,我没有找到qt中提供的渐变颜色选择器,然后就自己实现了一个。

        

        第一个是HSL空间中的明度变化图,第二个是透明度变化图。直接用鼠标点击就可以选择颜色。
        有了这两个工具后,设计时选择合适的颜色就变得容易了很多。

详细设计


(一)画板


         事件的重写

         主要的方法是重写了paintEvent(绘制事件), mouseMoveEvent(鼠标移动事件), mousePressEvent(鼠标点击事件), mouseReleaseEvent(鼠标抬起事件)。
         利用状态量来标识当前的绘制状态(如:绘制像素点,绘制空心圆,绘制实心圆……),然后在各种事件中根据当前状态,利用switch case来采取对应的操作,由于工具栏与画板在不同的cpp中,每次改变工具,主窗体都需要发射一个信号通知画板改变状态量,每次修改图像后,都要调用update()来刷新当前画面。

         为了实时显示鼠标移动过程中的绘制状态,需要在一开始启动鼠标轨迹追踪(setMouseTracing(true))。


         缓存


         在屏幕上显示的网格大小并不是真实的像素大小,而是要大一些。我们用map数组来存储每个网格的颜色信息,每次读取的时候遍历这个数组,把里面存储的颜色一个个显示到屏幕上。每次更新图像时,都要更新map数组。

         此外,因为鼠标移动时也会实时绘制,所以我们另外使用一个集合容器(currentPoint)来维护这些点,每次使用后就及时清空。

         除了当前画板的显示,我们在右侧还提供了实际图像的显示,这个图像由QImage暂存,因为QImage提供了像素点的底层操作。我们显示的时候,是将map数组的所有像素颜色直接调用setPixelColor复制过去的。又因为图像的显示是由主窗口控制的,所以我们提供了一个函数来返回包含这个QImage的QLabel的指针。由于新建的时候这个QImage将不再指向原来的内容,我们会发射一个信号通知主窗口更新图像指针。


        撤回与重做


         我们提供了撤回和重做的操作,在这里使用了最简单的方法来实现这一过程。在这里,我们支持30次回退,也就是说我们设计了30个map数组,每个map数组存储着某一时间状态下的完整图像,我们把所有图像当做一个队列来维护,所以我们事实上是通过front(队头), rear(队尾),layer(当前层)的修改来完成一系列操作的。这也就意味着,如果用户使用撤销后又继续绘制,新的绘制会覆盖用户原本可以重做的内容。这是因为我们保证了整个撤销重做是线性的,如果我们希望重做的内容不被覆盖,形成的将会是一个复杂的树形分支结构。

       绘制

       点和矩形的绘制就是普通的绘制,在这里,直线和圆的绘制都使用了Bresenham算法,它们具体是什么原理,可以参考这里。
       当然,这个算法虽然很经典,但是效果其实并不那么好,因为它最终形成的线是锯齿形的,而不是圆滑的。这并不是说这个算法是不正确的,这是用单一颜色绘制直线(圆)的最好效果了,但是为了达成圆滑的效果,我们往往采用灰度(明度)变化来表现线条的柔和,因为我不知道这个需要用什么算法,所以就没有进一步修改。

       混色
 
       由于这里使用了透明度来绘制,就会出现不同透明度颜色混合的现象,所以就要考虑混色,关于混色,可以参考这里。
  
       填色

       颜色填充使用的算法是种子填充法,也就是不断地向四周递归搜索,如果颜色相同的话。我们知道点的邻域有四邻域和八邻域,计算机图形学相关的书籍指出:在填充算法中,我们一般选择四邻域。八邻域往往会导致“过分”填充,而四邻域往往会导致填充“不足”,但是,相比之下,不足是可以弥补的,而过分填充却是难以弥补的,所以我们更倾向于四邻域填充算法。


(二)颜色条


        首先这里有两种颜色条,一个是明度颜色条,一个是渐变颜色条。渐变颜色条的实现很简单,就是不断地改变透明度(alpha通道)就可以了。
        关于明度变化,QColor中一般使用RGB来存储颜色信息的,一开始我以为要自己去写两种色彩空间(从RGB到HSL)的转换,后来发现qt本身提供了这种转换,所以就直接调用了QColor的这个方法,这样一来,明度变化也很简单的。
        至于这个渐变是怎样画出来的,实际上就是从0开始到255,不断变化明度(透明度),然后绘制一个个矩形。每个矩形的宽度就是width()/255,高度就是height()。在这里,我们的颜色与窗口坐标值是对应的,所以我们在点击这个颜色条的时候,也可以通过坐标值迅速的计算出选中的颜色。

图片资源(均有该像素画工具绘制)

                                             

box.icon   choose.png circle.png  circle1.png  color.png   color1.png

                                   

erase.png erase1.png fullcircle.png  fullcircle1.png  fullrect.png

                                                    

fullrect1.png  getcolor.png  getcolor1.png     grid.png     line.png    line1.png

                                                  

new.png       open.png       pixel.png      pixel1.png     rect.png      rect1.png

                 

redo.png     undo.png   save.png


代码


button.h
#ifndef BUTTON
#define BUTTON
#include<QToolButton>class Button : public QToolButton
{Q_OBJECT
private:QIcon m_NormalIcon;QIcon m_FocusIcon;QIcon m_PressedIcon;
protected:
public:void setPressImg();void setReleaseImg();Button(QWidget *parent = 0);Button(QString &str1,QString &str2,QString &str3);virtual ~Button();void SetButtonIcons(const QIcon &normal,const QIcon &focus = QIcon(),const QIcon &pressed = QIcon() );
};#endif // BUTTON

colorbar.h
#ifndef COLORBAR_H
#define COLORBAR_H
#include<QWidget>
class colorBarLight : public QWidget
{Q_OBJECT
public:static QColor color;colorBarLight(QWidget* parent = 0);
signals:void selectColor(QColor);
protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent *);
};class colorBarAlpha : public QWidget
{Q_OBJECT
public:static QColor color;colorBarAlpha(QWidget* parent = 0);
signals:void selectColor(QColor);
protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent*);
};#endif // COLORBAR_H

colorwindow.h
#ifndef COLORWINDOW_H
#define COLORWINDOW_H
#include<QWidget>
#include<QToolButton>
class QGroupBox;
class colorBarLight;
class colorBarAlpha;
class colorWindow:public QWidget
{Q_OBJECT
private:int chosenId;QToolButton* currentColorBtn;QString style[10];QToolButton* colorBtn[10];QGroupBox *btnGroup;QGroupBox *chosenColorGroup;colorBarLight* colorbar1;colorBarAlpha* colorbar2;QString getStyleSheet(const QColor& color);QString getStyleSheetAlpha(const QColor& color);
public:colorWindow(QWidget* parent = 0);
private slots:void changeColor(int);void changeColor(QColor);void changeColorLight(QColor);void changeColorAlpha(QColor);void colorDialog();};#endif // COLORWINDOW_H

newdialog.h
#ifndef NEWDIALOG_H
#define NEWDIALOG_H
#include<QWidget>
class QButtonGroup;
class QPushButton;
class QRadioButton;
class QLineEdit;
class QLabel;
class newDialog : public QWidget
{Q_OBJECT
private:QButtonGroup* radioGroup;QRadioButton* radio16;QRadioButton* radio32;QRadioButton* radio48;QRadioButton* radio64;QRadioButton* radioRandom;QPushButton* okBtn;QPushButton* cancelBtn;QLineEdit* startEdit;QLineEdit* finishEdit;QLabel* label1;QLabel* label2;
public:newDialog(QWidget* parent = 0);
private slots:void newFile();void radioChange();
signals:void sendIndex(int,int);
};#endif // NEWDIALOG_H

paint.h
#ifndef PAINT_H
#define PAINT_H
#include<QWidget>
#include<QPaintEvent>
#include<QMouseEvent>
#include<QColor>
#include<set>
class QLabel;
class point{
public:int x;int y;QColor c;point();point(QColor color,int i = -1,int j = -1);friend bool operator <(const point& x,const point& y);friend bool operator ==(const point& x,const point& y);
};class paintWindow:public QWidget
{Q_OBJECT
private:int XMAX;int YMAX;int size;enum{DRAWPIXEL,DRAWRECT,FILLCOLOR,DRAWFULLRECT,DRAWLINE,DRAWCIRCLE,DRAWFULLCIRCLE,ERASE,GETCOLOR};enum{TIMES=30};QImage *img;QLabel *picture;int state;QColor*** map;int layer;int front;int rear;int margin;std::set<point>currentPoint;bool isRelease;void updateMap();void bresenhamLine(int,int,int,int);void bresenhamLine(int,int,int,int,bool);void bresenhamCircle(int xc,int yc,int r);void bresenhamCircle(int xc,int yc,int x,int y);void bresenhamFullCircle(int xc,int yc,int r);void seedFilling(int i,int j);void updateImage();void drawTmpPixel();void drawOnScreenPixel();void setLayout(int,int);bool isShowGrid;inline int min(int x,int y){return x<y?x:y;}inline int max(int x,int y){return x>y?x:y;}QColor mixColor(const QColor& x,const QColor& y);public:static QColor color;void saveImage(const QString &fileName,int s);void undo();void redo();void drawRect();void drawPixel();void fillColor();void drawFullRect();void drawLine();void drawCircle();void drawFullCircle();void erase();void showGrid();void getColor();QLabel* getImage();void newImage(QImage* image);paintWindow(QWidget *parent = 0);~paintWindow();protected:void paintEvent(QPaintEvent *);void mouseMoveEvent(QMouseEvent *);void mousePressEvent(QMouseEvent *);void mouseReleaseEvent(QMouseEvent *);public slots:void changeSize(int,int);
signals:void changeColor(QColor);void changeImg();
};#endif // PAINT_H

pixel.h
#ifndef PIXEL_H
#define PIXEL_H#include <QObject>
#include "button.h"
#include "paint.h"
#include "colorwindow.h"
class Button;
class QWidget;
class QHBoxLayout;
class QVBoxLayout;
class QImage;
class QMenu;
class QMenuBar;
class QAction;
class QToolBar;
class QGroupBox;
class QPixmap;
class QPushButton;
class QPicture;
class QMainWindow;
class QDockWidget;
class pixel : public QObject
{Q_OBJECTprivate:QString filename;//主窗口QMainWindow* mainWindow;QWidget* window;//菜单栏QMenu* fileMenu;QMenu* editMenu;QMenu* showMenu;QImage* img;QMenuBar* menuBar;QAction* actionNew;QAction* actionSave;QAction* actionOpen;QAction* actionUndo;QAction* actionRedo;QAction* actionShowGrid;//工具栏QToolBar* toolBar;QAction* newTool;QAction* saveTool;//左边的状态栏QWidget* leftWidget;Button*leftToolBar;Button* drawRectBtn;Button* drawPixelBtn;Button* colorBtn;Button* drawFullRectBtn;Button* drawLineBtn;Button* drawCircleBtn;Button* drawFullCircleBtn;Button* eraseBtn;Button* getColorBtn;void setLeftTool();//画板paintWindow* paint;//颜色colorWindow* color;//图像显示QDockWidget* dock1;void setLayout();void createMenu();void createTool();void createPixmap();void createColorGroup();void updateIcon(int);Button *pixel::createButton(QString &str1,QString &str2,QString &str3);
public:pixel(QObject *parent = 0);~pixel();
public slots:bool save();void open();void undo();void redo();void drawRect();void fillColor();void drawPixel();void drawFullRect();void drawLine();void drawCircle();void drawFullCircle();void erase();void showGrid();void newFile();void updateImg();void getColor();void saveImg(int);
};#endif // PIXEL_H

savedialog.h
#ifndef SAVEDIALOG_H
#define SAVEDIALOG_H
#include<QWidget>
class QButtonGroup;
class QPushButton;
class QRadioButton;
class QLineEdit;
class QLabel;
class saveDialog : public QWidget
{Q_OBJECT
private:QButtonGroup* radioGroup;QRadioButton* radio1;QRadioButton* radio2;QRadioButton* radio3;QPushButton* okBtn;QPushButton* cancelBtn;
public:saveDialog(QWidget* parent = 0);
private slots:void saveFile();
signals:void save(int);
};
#endif // SAVEDIALOG_H

button.cpp
#include"button.h"
#include<QPixmap>Button::Button(QWidget *parent)
: QToolButton(parent)
{setDown(false);setFocusPolicy(Qt::NoFocus);
}Button::Button(QString &str1,QString &str2,QString &str3)
{QPixmap img1,img2,img3;img1.load(str1);img2.load(str2);img3.load(str3);setFixedSize(img1.width()/4*3,img1.height()/4*3);SetButtonIcons(img1,img2,img3);setStyleSheet("border:0px 0px 0px 0px;");setIconSize(QSize(img1.width()/4*3,img1.height()/4*3));
}Button::~Button()
{}void Button::setPressImg()
{setIcon(m_PressedIcon);
}void Button::setReleaseImg()
{setIcon(m_NormalIcon);
}void Button::SetButtonIcons(const QIcon &normal,const QIcon &focus, const QIcon &pressed)
{m_NormalIcon = normal;m_FocusIcon = focus;m_PressedIcon = pressed;setIcon(m_NormalIcon);
}

colorbar.cpp
 #include"colorbar.h"
#include<QPainter>
#include<QMouseEvent>
QColor colorBarLight::color(255,50,50,255);
QColor colorBarAlpha::color(255,50,50,255);
colorBarLight::colorBarLight(QWidget* parent):QWidget(parent) {setFixedHeight(30);
}void colorBarLight::paintEvent(QPaintEvent *)
{QPainter paint(this);int h,s,l;color.getHsl(&h,&s,&l);paint.setPen(Qt::NoPen);for(int i=0;i<width();i++){color.setHsl(h,s,(int)(1.0*i/width()*255));paint.setBrush(color);paint.drawRect(i,0,1,height());}}void colorBarLight::mousePressEvent(QMouseEvent *event)
{int x = event->pos().x();int h,s,l;color.getHsl(&h,&s,&l);QColor newColor;newColor.setHsl(h,s,(int)(1.0*x/width()*255));emit(selectColor(newColor));
}colorBarAlpha::colorBarAlpha(QWidget* parent):QWidget(parent) {setFixedHeight(30);
}void colorBarAlpha::paintEvent(QPaintEvent *)
{QPainter paint(this);paint.setPen(Qt::NoPen);int size = 8;for(int i=0;i<=width()/size;i++){for(int j=0;j<=height()/size;j++){paint.setBrush(QColor(222,222,222));paint.drawRect(size*i, size*j, size/2, size/2);paint.drawRect(size*i + size/2, size*j+size/2, size/2, size/2);paint.setBrush(QColor(255,255,255));paint.drawRect(size*i+size/2, size*j, size/2, size/2);paint.drawRect(size*i, size*j+size/2, size/2, size/2);}}for(int i=0;i<width();i++){color.setAlpha((int)((1.0*i/width())*255));paint.setBrush(color);paint.drawRect(i,0,1,height());}
}void colorBarAlpha::mousePressEvent(QMouseEvent *event)
{int x = event->pos().x();int alpha = (int)(1.0*x/width()*255);QColor newColor(color.red(),color.green(),color.blue(),alpha);emit(selectColor(newColor));
}

colorwindow.cpp
#include"colorwindow.h"
#include"paint.h"
#include"button.h"
#include"colorbar.h"
#include<QGridLayout>
#include<QVBoxLayout>
#include<QGroupBox>
#include<QSignalMapper>
#include<QColorDialog>colorWindow::colorWindow(QWidget* parent):QWidget(parent)
{colorbar1 = new colorBarLight;colorbar2 = new colorBarAlpha;QVBoxLayout* vlayout = new QVBoxLayout();QGridLayout* glayout = new QGridLayout();QGridLayout* glayout1 = new QGridLayout();QSignalMapper* signalMapper[10];QString str0 = "choose.png";Button* chooseNewColorBtn = new Button(str0,str0,str0);chooseNewColorBtn->setStyleSheet("border:1px solid #d1d1d1;");currentColorBtn = new QToolButton();btnGroup = new QGroupBox;chosenColorGroup = new QGroupBox;connect(chooseNewColorBtn,SIGNAL(clicked(bool)),this,SLOT(colorDialog()));QString str[] ={"border:1px solid #d1d1d1;background-color:rgb(255,50,50);","border:1px solid #d1d1d1;background-color:rgb(255,125,50);","border:1px solid #d1d1d1;background-color:rgb(255,50,255);","border:1px solid #d1d1d1;background-color:rgb(255,255,50);","border:1px solid #d1d1d1;background-color:rgb(50,255,50);","border:1px solid #d1d1d1;background-color:rgb(50,50,255);","border:1px solid #d1d1d1;background-color:rgb(50,255,255);","border:1px solid #d1d1d1;background-color:rgb(255,255,255);","border:1px solid #d1d1d1;background-color:rgb(50,50,50);","border:1px solid #d1d1d1;background-color:rgb(156,156,156);"};for(int i=0;i<10;i++){style[i] = str[i];signalMapper[i] = new QSignalMapper();colorBtn[i] = new QToolButton();colorBtn[i]->setStyleSheet(style[i]);connect(colorBtn[i],SIGNAL(clicked()),signalMapper[i],SLOT(map()));signalMapper[i]->setMapping(colorBtn[i],i);connect(signalMapper[i],SIGNAL(mapped(int)),this,SLOT(changeColor(int)));glayout->addWidget(colorBtn[i],i/2,i%2);}currentColorBtn->setStyleSheet(style[0]);glayout1->addWidget(currentColorBtn,0,0,1,1);glayout1->addWidget(chooseNewColorBtn,0,1,1,1);chosenColorGroup->setLayout(glayout1);btnGroup->setLayout(glayout);vlayout->addWidget(chosenColorGroup);vlayout->addWidget(btnGroup);vlayout->addWidget(colorbar1);vlayout->addWidget(colorbar2);vlayout->addStretch();setLayout(vlayout);setMaximumWidth(100);connect(colorbar1,SIGNAL(selectColor(QColor)),this,SLOT(changeColorLight(QColor)));connect(colorbar2,SIGNAL(selectColor(QColor)),this,SLOT(changeColorAlpha(QColor)));
}void colorWindow::changeColor(int id)
{int num[10][3] = {255,50,50,255,125,50,255,50,255,255,255,50,50,255,50,50,50,255,50,255,255,255,255,255,50,50,50,156,156,156};currentColorBtn->setStyleSheet(style[id]);paintWindow::color = QColor(num[id][0],num[id][1],num[id][2]);colorBarLight::color = QColor(num[id][0],num[id][1],num[id][2]);colorBarAlpha::color = QColor(num[id][0],num[id][1],num[id][2]);colorbar1->update();colorbar2->update();
}QString colorWindow::getStyleSheetAlpha(const QColor& color)
{QString str = "border:1px solid #d1d1d1;background-color:rgba(";str = str + QString::number(color.red()) + "," + QString::number(color.green()) + ","+ QString::number(color.blue()) + "," + QString::number(1.0*color.alpha()/255*100) + "%);";return str;
}QString colorWindow::getStyleSheet(const QColor& color)
{QString str = "border:1px solid #d1d1d1;background-color:rgb(";str = str + QString::number(color.red()) + "," + QString::number(color.green()) + ","+ QString::number(color.blue()) + ");";return str;
}void colorWindow::changeColorLight(QColor color)
{currentColorBtn->setStyleSheet(getStyleSheet(color));paintWindow::color = color;colorBarAlpha::color = color;colorbar2->update();
}void colorWindow::changeColorAlpha(QColor color)
{currentColorBtn->setStyleSheet(getStyleSheetAlpha(color));paintWindow::color = color;colorBarAlpha::color = color;colorbar1->update();
}void colorWindow::changeColor(QColor color)
{currentColorBtn->setStyleSheet(getStyleSheetAlpha(color));paintWindow::color = color;colorBarLight::color = color;colorBarAlpha::color = color;colorbar1->update();colorbar2->update();
}void colorWindow::colorDialog()
{QColor color = QColorDialog::getColor(Qt::white, this);if(color==QColor::Invalid){color = paintWindow::color;}QString str = getStyleSheet(color);currentColorBtn->setStyleSheet(str);paintWindow::color = color;colorBarLight::color = color;colorBarAlpha::color = color;colorbar1->update();colorbar2->update();
}

newdialog.cpp
#include"newdialog.h"
#include<QRadioButton>
#include<QVBoxLayout>
#include<QHBoxLayout>
#include<QPushButton>
#include<QButtonGroup>
#include<QLineEdit>
#include<QLabel>
#include<QMessageBox>newDialog::newDialog(QWidget* parent):QWidget(parent)
{QVBoxLayout* vlayout = new QVBoxLayout;QVBoxLayout* vlayout1 = new QVBoxLayout;QHBoxLayout* hlayout = new QHBoxLayout;QHBoxLayout* hlayout1 = new QHBoxLayout;startEdit = new QLineEdit();finishEdit = new QLineEdit();label1 = new QLabel(QStringLiteral("宽度:"));label2 = new QLabel(QStringLiteral("高度:"));startEdit->setEnabled(false);finishEdit->setEnabled(false);okBtn = new QPushButton(QStringLiteral("确定"));cancelBtn = new QPushButton(QStringLiteral("取消"));radioGroup = new QButtonGroup();radio16 = new QRadioButton("16x16",this);radio32 = new QRadioButton("32x32",this);radio48 = new QRadioButton("48x48",this);radio64 = new QRadioButton("64x64",this);radioRandom = new QRadioButton(QStringLiteral("自定义"),this);radio32->setChecked(true);radioGroup->addButton(radio16,1);radioGroup->addButton(radio32,2);radioGroup->addButton(radio48,3);radioGroup->addButton(radio64,4);radioGroup->addButton(radioRandom,5);vlayout1->addWidget(radio16);vlayout1->addWidget(radio32);vlayout1->addWidget(radio48);vlayout1->addWidget(radio64);vlayout1->addWidget(radioRandom);hlayout1->addLayout(vlayout1);hlayout1->addWidget(label1);hlayout1->addWidget(startEdit);hlayout1->addWidget(label2);hlayout1->addWidget(finishEdit);hlayout->addWidget(okBtn);hlayout->addWidget(cancelBtn);vlayout->addLayout(hlayout1);vlayout->addLayout(hlayout);connect(radio16, SIGNAL(clicked(bool)), this, SLOT(radioChange()));connect(radio32, SIGNAL(clicked(bool)), this, SLOT(radioChange()));connect(radio48, SIGNAL(clicked(bool)), this, SLOT(radioChange()));connect(radio64, SIGNAL(clicked(bool)), this, SLOT(radioChange()));connect(radioRandom, SIGNAL(clicked(bool)), this, SLOT(radioChange()));connect(okBtn,SIGNAL(clicked()),this,SLOT(newFile()));connect(cancelBtn,SIGNAL(clicked()),this,SLOT(close()));setLayout(vlayout);setWindowFlags(Qt::WindowStaysOnTopHint);setWindowModality(Qt::ApplicationModal);setWindowTitle(QStringLiteral("新建"));
}void newDialog::radioChange()
{int id = radioGroup->checkedId();if(id==5){startEdit->setEnabled(true);finishEdit->setEnabled(true);}else{startEdit->setEnabled(false);finishEdit->setEnabled(false);}
}void newDialog::newFile()
{int id = radioGroup->checkedId();if(id>=1&&id<=4){int num = id*16;emit(sendIndex(num,num));}else{int num1 = startEdit->text().toInt();int num2 = finishEdit->text().toInt();if(num1<150&&num2<150&&num1>0&&num2>0){emit(sendIndex(num1,num2));}else{QMessageBox msg(QMessageBox::Warning, "warning", QStringLiteral("指定大小超过限制/不符规范"),QMessageBox::Yes, NULL);msg.exec();}}close();
}

paint.cpp
#include"paint.h"
#include<QPainter>
#include<QApplication>
#include<QLabel>
QColor paintWindow::color(255,50,50,255);point::point(QColor color,int i,int j):x(i),y(j) {c = color;
}bool operator <(const point& a,const point& b)
{return a.x<b.x||(a.x==b.x&&a.y<b.y);
}bool operator ==(const point& a,const point& b)
{return a.x==b.x&&a.y==b.y;
}point::point(){ }paintWindow::paintWindow(QWidget *parent):QWidget(parent)
{setLayout(32,32);
}void paintWindow::setLayout(int x,int y)
{XMAX = x;YMAX = y;margin = 10;if(x<50&&y<50)size = 10;else if(x<100&&y<100)size =8;else if(y<150&&y<150)size = 6;map = new QColor**[XMAX];for(int i=0;i<XMAX;i++){map[i] = new QColor*[YMAX];for(int j=0;j<YMAX;j++){map[i][j] = new QColor[TIMES];}}for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){map[i][j][0] = QColor(0,0,0,0);}}img = new QImage(XMAX,YMAX,QImage::Format_ARGB32);img->fill(QColor(0,0,0,0));picture = new QLabel;picture->setPixmap(QPixmap::fromImage(*img));layer = 0;front = rear = 0;state = DRAWPIXEL;isRelease = true;isShowGrid = false;setMouseTracking(true);setMinimumWidth(XMAX*size+2*margin);setMinimumHeight(YMAX*size+2*margin);
}void paintWindow::changeSize(int x,int y)
{delete img;for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){delete map[i][j];}delete map[i];}delete map;delete picture;setLayout(x,y);emit(changeImg());
}void paintWindow::newImage(QImage* image)
{delete map;delete picture;setLayout(image->width(),image->height());for(int i=0;i<image->width();i++){for(int j=0;j<image->height();j++){map[i][j][0] = image->pixelColor(i,j);}}update();
}paintWindow::~paintWindow()
{}void paintWindow::drawOnScreenPixel()
{QPainter paint(this);paint.setPen(Qt::NoPen);if(front!=rear){for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){if(map[i][j][layer]!=QColor(0,0,0,0)&¤tPoint.find(point(QColor(0,0,0,0),i,j))==currentPoint.end()){paint.setBrush(map[i][j][layer]);paint.drawRect(i*size+margin,j*size+margin,size,size);}}}}
}void paintWindow::drawTmpPixel()
{QPainter paint(this);paint.setPen(Qt::NoPen);std::set<point>::iterator it;for(it=currentPoint.begin();it!=currentPoint.end();it++){if(it->x>=0&&it->y>=0&&it->x<XMAX&&it->y<YMAX) {QColor c;if(it->c.alpha()!=255&&map[it->x][it->y][layer]!=QColor(0,0,0,0)){c = mixColor(map[it->x][it->y][layer],it->c);}else c = it->c;paint.setBrush(c);paint.drawRect(it->x*size+margin,it->y*size+margin,size,size);}}
}void paintWindow::paintEvent(QPaintEvent *)
{QPainter paint(this);for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){          paint.setPen(Qt::NoPen);paint.setBrush(QColor(222,222,222));paint.drawRect(size*i+margin, size*j+margin, size/2, size/2);paint.drawRect(size*i + size/2+margin, size*j+size/2+margin, size/2, size/2);paint.setBrush(QColor(255,255,255));paint.drawRect(size*i+size/2+margin, size*j+margin, size/2, size/2);paint.drawRect(size*i+margin, size*j+size/2+margin, size/2, size/2);if(isShowGrid){paint.setPen(QColor(200,200,200));paint.setBrush(QColor(0,0,0,0));paint.drawRect(size*i+margin, size*j+margin, size, size);}}}if(state==ERASE){paint.setPen(Qt::NoPen);if(front!=rear){for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){if(map[i][j][layer]!=QColor(0,0,0,0)&&currentPoint.find(point(QColor(0,0,0,0),i,j))==currentPoint.end()){paint.setBrush(map[i][j][layer]);paint.drawRect(i*size+margin,j*size+margin,size,size);}}}}std::set<point>::iterator it;for(it=currentPoint.begin();it!=currentPoint.end();it++){if(it->x>=0&&it->y>=0&&it->x<XMAX&&it->y<YMAX) {paint.setBrush(it->c);paint.drawRect(it->x*size+margin,it->y*size+margin,size,size);}}}else{drawOnScreenPixel();drawTmpPixel();}}void paintWindow::updateImage()
{for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){img->setPixelColor(i,j,map[i][j][layer]);}}picture->setPixmap(QPixmap::fromImage(*img));
}void paintWindow::mouseMoveEvent(QMouseEvent *event)
{int j = (event->pos().y()-margin)/size;int i = (event->pos().x()-margin)/size;static int x1, y1;static int x2, y2;currentPoint.clear();if(event->pos().y()-margin<0||event->pos().x()-margin<0){update();return;}switch(state){case DRAWRECT:if(event->buttons()&Qt::LeftButton){if(isRelease){isRelease = false;x1 = i;y1 = j;}x2 = i;y2 = j;int minX = min(x1,x2);int minY = min(y1,y2);int maxX = max(x1,x2);int maxY = max(y1,y2);for(int k=minX;k<=maxX;k++){currentPoint.insert(point(color,k,minY));currentPoint.insert(point(color,k,maxY));}for(int k=minY+1;k<=maxY-1;k++){currentPoint.insert(point(color,minX,k));currentPoint.insert(point(color,maxX,k));}}break;case DRAWPIXEL:currentPoint.insert(point(color,i,j));break;case DRAWFULLRECT:if(event->buttons()&Qt::LeftButton){if(isRelease){isRelease = false;x1 = i;y1 = j;}x2 = i;y2 = j;int minX = min(x1,x2);int minY = min(y1,y2);int maxX = max(x1,x2);int maxY = max(y1,y2);for(int k=minX;k<=maxX;k++){for(int t=minY;t<=maxY;t++){currentPoint.insert(point(color,k,t));}}}break;case DRAWLINE:if(event->buttons()&Qt::LeftButton){if(isRelease){isRelease = false;x1 = i;y1 = j;}x2 = i;y2 = j;bresenhamLine(x1,y1,x2,y2);}break;case DRAWCIRCLE:if(event->buttons()&Qt::LeftButton){if(isRelease){isRelease = false;x1 = i;y1 = j;}x2 = i;y2 = j;bresenhamCircle(x1,y1,abs(x2-x1));}break;case DRAWFULLCIRCLE:if(event->buttons()&Qt::LeftButton){if(isRelease){isRelease = false;x1 = i;y1 = j;}x2 = i;y2 = j;bresenhamFullCircle(x1,y1,abs(x2-x1));}break;case ERASE:QColor tmp(0,0,0,0);currentPoint.insert(point(tmp,i,j));break;};update();
}void paintWindow::mousePressEvent(QMouseEvent *event)
{static int count = 0;int j = (event->pos().y()-margin)/size;int i = (event->pos().x()-margin)/size;switch(state){case DRAWPIXEL:if(i>=0&&i<XMAX&&j>=0&&j<YMAX){updateMap();map[i][j][layer] = color;update();}break;case FILLCOLOR:if(i>=0&&i<XMAX&&j>=0&&j<YMAX){updateMap();seedFilling(i,j);update();}break;case GETCOLOR:if(i>=0&&i<XMAX&&j>=0&&j<YMAX){emit(changeColor(map[i][j][layer]));}}
}void paintWindow::mouseReleaseEvent(QMouseEvent *event)
{isRelease = true;std::set<point>::iterator it;switch(state){case ERASE:updateMap();for(it=currentPoint.begin();it!=currentPoint.end();it++){if(it->x>=0&&it->y>=0&&it->x<XMAX&&it->y<YMAX) {map[it->x][it->y][layer] = it->c;}}currentPoint.clear();update();break;case DRAWRECT:case DRAWFULLRECT:case DRAWLINE:case DRAWCIRCLE:case DRAWFULLCIRCLE:updateMap();for(it=currentPoint.begin();it!=currentPoint.end();it++){if(it->x>=0&&it->y>=0&&it->x<XMAX&&it->y<YMAX) {if(it->c.alpha()!=255&&map[it->x][it->y][layer]!=QColor(0,0,0,0)){map[it->x][it->y][layer]= mixColor(map[it->x][it->y][layer],it->c);}else map[it->x][it->y][layer] = it->c;}}currentPoint.clear();update();break;}updateImage();
}QColor paintWindow::mixColor(const QColor& x,const QColor& y)
{float a1 = 1.0f*x.alpha()/255;float a2 = 1.0f*y.alpha()/255;int r,g,b,a;r = x.red()*a1*(1-a2)+y.red()*a2/(a1+a2-a1*a2);g = x.green()*a1*(1-a2)+y.green()*a2/(a1+a2-a1*a2);b = x.blue()*a1*(1-a2)+y.blue()*a2/(a1+a2-a1*a2);a = (1-(1-a1)*(1-a2))*255;return QColor(r,g,b,a);
}void paintWindow::bresenhamLine(int x1,int y1,int x2,int y2)
{if(abs(x2-x1)<abs(y2-y1)){bresenhamLine(y1,x1,y2,x2,false);}else{bresenhamLine(x1,y1,x2,y2,true);}
}void paintWindow::bresenhamLine(int x1,int y1,int x2,int y2,bool isDxBigger)
{int dx = abs(x2-x1);int dy = abs(y2-y1);int d = 2*dy - dx;for(int cx=x1,cy=y1;cx!=x2;cx+=(x2-x1>0?1:-1)){if(d<0){d += dy*2;}else{cy += (y2-y1)>0?1:-1;d += (dy - dx)*2;}if(isDxBigger)currentPoint.insert(point(color,cx,cy));else currentPoint.insert(point(color,cy,cx));}if(isDxBigger){currentPoint.insert(point(color,x1,y1));currentPoint.insert(point(color,x2,y2));}else{currentPoint.insert(point(color,y1,x1));currentPoint.insert(point(color,y2,x2));}
}void paintWindow::bresenhamCircle(int xc,int yc,int r)
{int x = 0,y = r,p = 3 - 2*3;while(x<y){bresenhamCircle(xc,yc,x,y);if(p<0)p = p + 4*x + 6;else{p = p + 4*(x-y)+10;y--;}x++;}if(x==y){bresenhamCircle(xc,yc,x,y);}
}void paintWindow::bresenhamFullCircle(int xc,int yc,int r)
{int x = 0,y = r,p = 3 - 2*3;while(x<y){for(int i=x;i<=y;i++){bresenhamCircle(xc,yc,x,i);}if(p<0)p = p + 4*x + 6;else{p = p + 4*(x-y)+10;y--;}x++;}if(x==y){bresenhamCircle(xc,yc,x,y);}
}void paintWindow::bresenhamCircle(int xc,int yc,int x,int y)
{if(xc+x<XMAX&&yc+y<YMAX)currentPoint.insert(point(color,xc+x,yc+y));if(xc-x>=0&&yc+y<YMAX)currentPoint.insert(point(color,xc-x,yc+y));if(xc+x<XMAX&&yc-y>=0)currentPoint.insert(point(color,xc+x,yc-y));if(xc-x>=0&&yc-y>=0)currentPoint.insert(point(color,xc-x,yc-y));if(xc+y<XMAX&&yc+x<YMAX)currentPoint.insert(point(color,xc+y,yc+x));if(xc-y>=0&&yc+x<YMAX)currentPoint.insert(point(color,xc-y,yc+x));if(xc+y<XMAX&&yc-x>=0)currentPoint.insert(point(color,xc+y,yc-x));if(xc-y>=0&&yc-x>=0)currentPoint.insert(point(color,xc-y,yc-x));
}void paintWindow::updateMap()
{for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){map[i][j][(layer+1)%TIMES] = map[i][j][layer];}}layer = (layer+1)%TIMES;rear = layer;if(rear==front)front = (front+1)%TIMES;
}void paintWindow::seedFilling(int i,int j)
{int dx[] = {0,1,0,-1};int dy[] = {1,0,-1,0};QColor originalColor = map[i][j][layer];if(color==originalColor)return;map[i][j][layer] = color;for(int k=0;k<4;k++){int x = i + dx[k];int y = j + dy[k];if(x<XMAX&&x>=0&&y<YMAX&&y>=0&&map[x][y][layer]== originalColor){seedFilling(x,y);}}
}void paintWindow::undo()
{if(layer!=front){layer = (layer+TIMES-1)%TIMES;update();updateImage();}
}void paintWindow::redo()
{if(layer!=rear){layer = (layer+1)%TIMES;update();updateImage();}
}void paintWindow::drawRect()
{state = DRAWRECT;
}void paintWindow::drawPixel()
{state = DRAWPIXEL;
}void paintWindow::fillColor()
{state = FILLCOLOR;
}void paintWindow::drawFullRect()
{state = DRAWFULLRECT;
}void paintWindow::drawLine()
{state = DRAWLINE;
}void paintWindow::drawCircle()
{state = DRAWCIRCLE;
}void paintWindow::drawFullCircle()
{state = DRAWFULLCIRCLE;
}void paintWindow::erase()
{state = ERASE;
}void paintWindow::getColor()
{state  = GETCOLOR;
}void paintWindow::showGrid()
{isShowGrid==true?isShowGrid=false:isShowGrid=true;update();
}QLabel* paintWindow::getImage()
{return picture;
}void paintWindow::saveImage(const QString &fileName,int s)
{QImage* img1;if(s==1){updateImage();img->save(fileName);}else if(s==2){img1 = new QImage(XMAX*2,YMAX*2,QImage::Format_ARGB32);for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){img1->setPixelColor(2*i,2*j,map[i][j][layer]);img1->setPixelColor(2*i+1,2*j,map[i][j][layer]);img1->setPixelColor(2*i,2*j+1,map[i][j][layer]);img1->setPixelColor(2*i+1,2*j+1,map[i][j][layer]);}}img1->save(fileName);}else if(s==3){img1 = new QImage(XMAX*3,YMAX*3,QImage::Format_ARGB32);for(int i=0;i<XMAX;i++){for(int j=0;j<YMAX;j++){img1->setPixelColor(3*i,3*j,map[i][j][layer]);img1->setPixelColor(3*i+1,3*j,map[i][j][layer]);img1->setPixelColor(3*i,3*j+1,map[i][j][layer]);img1->setPixelColor(3*i+1,3*j+1,map[i][j][layer]);img1->setPixelColor(3*i+2,3*j,map[i][j][layer]);img1->setPixelColor(3*i+2,3*j+1,map[i][j][layer]);img1->setPixelColor(3*i+1,3*j+2,map[i][j][layer]);img1->setPixelColor(3*i,3*j+2,map[i][j][layer]);img1->setPixelColor(3*i+2,3*j+2,map[i][j][layer]);}}img1->save(fileName);}}

pixel.cpp
#include "pixel.h"
#include"newdialog.h"
#include"savedialog.h"
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QWidget>
#include<QImage>
#include<QLabel>
#include<QMenu>
#include<QMenuBar>
#include<QAction>
#include<QToolBar>
#include<QPixmap>
#include<QString>
#include<QGroupBox>
#include<QGridLayout>
#include<QPicture>
#include<QPushButton>
#include<QFileDialog>
#include<QDockWidget>
#include<QMainWindow>
#include<QMessageBox>
#include<QApplication>
#include"colorbar.h"
pixel::pixel(QObject *parent): QObject(parent)
{setLayout();
}void pixel::setLayout()
{window = new QWidget;mainWindow = new QMainWindow;QVBoxLayout* vlayout = new QVBoxLayout;QVBoxLayout* vlayout1 = new QVBoxLayout;QVBoxLayout* vlayout2 = new QVBoxLayout;QHBoxLayout* hlayout = new QHBoxLayout;QHBoxLayout* hlayout1 = new QHBoxLayout;QDockWidget* dock = new QDockWidget(QStringLiteral("工具栏"),window);//设置paint窗口处于中央paint = new paintWindow;vlayout2->addStretch();vlayout2->addWidget(paint);vlayout2->addStretch();hlayout1->addStretch();hlayout1->addLayout(vlayout2);hlayout1->addStretch();dock1 = new QDockWidget(QStringLiteral("图像"),window);createMenu();createTool();setLeftTool();createColorGroup();dock->setWidget(leftWidget);dock1->setWidget(paint->getImage());vlayout->addWidget(menuBar);vlayout->addWidget(toolBar);toolBar->setStyleSheet("background-color:rgb(220,220,220);");vlayout1->addWidget(color);hlayout->addLayout(hlayout1);hlayout->addLayout(vlayout1);vlayout->addLayout(hlayout);mainWindow->addDockWidget(Qt::LeftDockWidgetArea,dock);mainWindow->addDockWidget(Qt::RightDockWidgetArea,dock1);connect(paint,SIGNAL(changeImg()),this,SLOT(updateImg()));connect(paint,SIGNAL(changeColor(QColor)),color,SLOT(changeColor(QColor)));window->setLayout(vlayout);window->resize(800,700);mainWindow->setCentralWidget(window);mainWindow->show();
}void pixel::createMenu()
{menuBar = new QMenuBar();menuBar->setFixedHeight(28);fileMenu = menuBar->addMenu(QStringLiteral("文件"));editMenu = menuBar->addMenu(QStringLiteral("编辑"));showMenu = menuBar->addMenu(QStringLiteral("显示"));actionNew = fileMenu->addAction(QIcon("new.png"),QStringLiteral("&新建"));actionOpen = fileMenu->addAction(QIcon("open.png"),QStringLiteral("&打开"));actionSave = fileMenu->addAction(QIcon("save.png"),QStringLiteral("&保存"));actionUndo = editMenu->addAction(QIcon("undo.png"),QStringLiteral("&撤销"));actionRedo = editMenu->addAction(QIcon("redo.png"),QStringLiteral("&重做"));actionShowGrid = showMenu->addAction(QIcon("grid.png"),QStringLiteral("&显示网格"));actionNew->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));actionOpen->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O));actionSave->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));actionUndo->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z));actionRedo->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Y));connect(actionSave, SIGNAL(triggered()),this, SLOT(save()));connect(actionUndo,SIGNAL(triggered()),this,SLOT(undo()));connect(actionRedo,SIGNAL(triggered()),this,SLOT(redo()));connect(actionShowGrid,SIGNAL(triggered()),this,SLOT(showGrid()));connect(actionNew,SIGNAL(triggered()),this,SLOT(newFile()));connect(actionOpen,SIGNAL(triggered()),this,SLOT(open()));}void pixel::open()
{QString name = QFileDialog::getOpenFileName(window,tr("Choose Image"),"",tr("*.bmp;; *.png;; *.jpg;; *.tif;; *.GIF")); //选择路径if(name.isEmpty()){return;}else{QImage* img = new QImage();if(! ( img->load(name) ) ) //加载图像{QMessageBox msg(QMessageBox::Warning, "error", QStringLiteral("打开图像失败"),QMessageBox::Yes, NULL);msg.exec();delete img;return;}else{if(img->width()<150&&img->height()<150){paint->newImage(img);delete img;return;}else{QMessageBox msg(QMessageBox::Warning, "error", QStringLiteral("图片过大"),QMessageBox::Yes, NULL);msg.exec();delete img;return;}}}
}bool pixel::save()
{filename = QFileDialog::getSaveFileName(window,tr("Save Image"),"",tr("*.bmp;; *.png;; *.jpg;; *.tif;; *.GIF")); //选择路径if(filename.isEmpty()){return false;}else{saveDialog* dialog = new saveDialog();dialog->show();connect(dialog,SIGNAL(save(int)),this,SLOT(saveImg(int)));return true;}
}void pixel::saveImg(int size)
{paint->saveImage(filename,size);
}void pixel::undo()
{paint->undo();
}void pixel::redo()
{paint->redo();
}void pixel::createTool()
{toolBar = new QToolBar(tr("&文件"));toolBar->addSeparator();toolBar->addAction(actionNew);toolBar->addAction(actionOpen);toolBar->addAction(actionSave);toolBar->addAction(actionUndo);toolBar->addAction(actionRedo);toolBar->addAction(actionShowGrid);
}void pixel::setLeftTool()
{leftWidget = new QWidget();leftWidget->setStyleSheet("background-color:rgb(230,230,230);");QString str[] = {"rect.png","pixel.png","color.png","fullrect.png","line.png","circle.png","fullcircle.png","erase.png","getcolor.png"};QString str1[] = {"rect1.png","pixel1.png","color1.png","fullrect1.png","line1.png","circle1.png","fullcircle1.png","erase1.png","getcolor1.png"};drawRectBtn = new Button(str[0],str1[0],str1[0]);drawPixelBtn = new Button(str[1],str1[1],str1[1]);colorBtn = new Button(str[2],str1[2],str1[2]);drawFullRectBtn = new Button(str[3],str1[3],str1[3]);drawLineBtn = new Button(str[4],str1[4],str1[4]);drawCircleBtn = new Button(str[5],str1[5],str1[5]);drawFullCircleBtn = new Button(str[6],str1[6],str1[6]);eraseBtn = new Button(str[7],str1[7],str1[7]);getColorBtn = new Button(str[8],str1[8],str1[8]);QVBoxLayout* vlayout = new QVBoxLayout();vlayout->addWidget(drawRectBtn);vlayout->addWidget(drawPixelBtn);vlayout->addWidget(colorBtn);vlayout->addWidget(drawFullRectBtn);vlayout->addWidget(drawLineBtn);vlayout->addWidget(drawCircleBtn);vlayout->addWidget(drawFullCircleBtn);vlayout->addWidget(eraseBtn);vlayout->addWidget(getColorBtn);vlayout->addStretch();leftWidget->setLayout(vlayout);drawPixelBtn->setPressImg();connect(drawRectBtn, SIGNAL(clicked()),this, SLOT(drawRect()));connect(drawPixelBtn, SIGNAL(clicked()),this, SLOT(drawPixel()));connect(colorBtn,SIGNAL(clicked()),this,SLOT(fillColor()));connect(drawFullRectBtn,SIGNAL(clicked()),this,SLOT(drawFullRect()));connect(drawLineBtn,SIGNAL(clicked()),this,SLOT(drawLine()));connect(drawCircleBtn,SIGNAL(clicked()),this,SLOT(drawCircle()));connect(drawFullCircleBtn,SIGNAL(clicked()),this,SLOT(drawFullCircle()));connect(eraseBtn,SIGNAL(clicked()),this,SLOT(erase()));connect(getColorBtn,SIGNAL(clicked()),this,SLOT(getColor()));
}void pixel::newFile()
{QMessageBox msg(QMessageBox::Warning, "warning", QStringLiteral("是否保存当前图像?"),QMessageBox::Yes | QMessageBox::No, NULL);if(msg.exec()==QMessageBox::Yes){if(!save())return;}newDialog* dialog = new newDialog;connect(dialog,SIGNAL(sendIndex(int,int)),paint,SLOT(changeSize(int,int)));dialog->show();
}void pixel::updateIcon(int id)
{drawRectBtn->setReleaseImg();drawPixelBtn->setReleaseImg();colorBtn->setReleaseImg();drawFullRectBtn->setReleaseImg();drawLineBtn->setReleaseImg();drawCircleBtn->setReleaseImg();drawFullCircleBtn->setReleaseImg();eraseBtn->setReleaseImg();getColorBtn->setReleaseImg();switch(id){case 1:drawRectBtn->setPressImg();break;case 2:drawPixelBtn->setPressImg();break;case 3:colorBtn->setPressImg();break;case 4:drawFullRectBtn->setPressImg();break;case 5:drawLineBtn->setPressImg();break;case 6:drawCircleBtn->setPressImg();break;case 7:drawFullCircleBtn->setPressImg();break;case 8:eraseBtn->setPressImg();break;case 9:getColorBtn->setPressImg();break;default:break;}
}void pixel::drawRect()
{paint->drawRect();updateIcon(1);
}void pixel::drawPixel()
{paint->drawPixel();updateIcon(2);
}void pixel::fillColor()
{paint->fillColor();updateIcon(3);
}void pixel::drawFullRect()
{paint->drawFullRect();updateIcon(4);
}void pixel::drawLine()
{paint->drawLine();updateIcon(5);
}void pixel::drawCircle()
{paint->drawCircle();updateIcon(6);
}void pixel::drawFullCircle()
{paint->drawFullCircle();updateIcon(7);
}void pixel::erase()
{paint->erase();updateIcon(8);
}void pixel::getColor()
{paint->getColor();updateIcon(9);
}void pixel::showGrid()
{paint->showGrid();
}void pixel::createColorGroup()
{color = new colorWindow();
}void pixel::updateImg()
{dock1->setWidget(paint->getImage());
}pixel::~pixel()
{}

savedialog.cpp
#include"savedialog.h"
#include<QRadioButton>
#include<QGroupBox>
#include<QVBoxLayout>
#include<QHBoxLayout>
#include<QPushButton>
#include<QButtonGroup>
#include<QLineEdit>
#include<QLabel>
#include<QMessageBox>saveDialog::saveDialog(QWidget* parent):QWidget(parent)
{QVBoxLayout* vlayout = new QVBoxLayout;QHBoxLayout* hlayout = new QHBoxLayout;okBtn = new QPushButton(QStringLiteral("确定"));cancelBtn = new QPushButton(QStringLiteral("取消"));radioGroup = new QButtonGroup();radio1 = new QRadioButton(QStringLiteral("原始大小(1x1)"),this);radio2 = new QRadioButton(QStringLiteral("4倍大小(2x2)"),this);radio3 = new QRadioButton(QStringLiteral("9倍大小(3x3)"),this);radio1->setChecked(true);radioGroup->addButton(radio1,1);radioGroup->addButton(radio2,2);radioGroup->addButton(radio3,3);hlayout->addWidget(okBtn);hlayout->addWidget(cancelBtn);vlayout->addWidget(radio1);vlayout->addWidget(radio2);vlayout->addWidget(radio3);vlayout->addLayout(hlayout);connect(okBtn,SIGNAL(clicked()),this,SLOT(saveFile()));connect(cancelBtn,SIGNAL(clicked()),this,SLOT(close()));setLayout(vlayout);setWindowFlags(Qt::WindowStaysOnTopHint);setWindowModality(Qt::ApplicationModal);setWindowTitle(QStringLiteral("保存设置"));
}void saveDialog::saveFile()
{emit(save(radioGroup->checkedId()));close();
}

main.cpp
#include "pixel.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);pixel w;a.setWindowIcon(QIcon("box.ico"));return a.exec();
}


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

相关文章

  1. 最有效的一种技术领导是“以身作则”

    开发团队需要遵守纪律才能从现代软件工程规范中获益。如果你的团队没有正确的工程纪律,那么你们所使用的工具和流程几乎都起不到什么作用。这一点,我已经在“Discipline Makes Strong Developers”(纪律造就强大的开发者)一文中着重论述过了。 有人提议,应该在团队里配备一…...

    2024/4/20 0:57:40
  2. 第27章 LTDC/DMA2D—液晶显示—零死角玩转STM32-F429系列

    第27章 LTDC/DMA2D&mdash;液晶显示全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:《STM32F4xx 中文参考手册2》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperi…...

    2024/4/20 13:53:11
  3. BeanShell in JMeter(Performance Test) —— JMeter中的Beanshell使用

    1 Introduction 1.1 Overview BeanShell是一个小的,免费的,用Java写的,面向对象的嵌入式的Java资源解释器。它动态的执行标准的Java语法,像Perl和JavaScript的脚本一样,是松散的类型,命令和方法关闭。 BeanShell is a small, free, embeddable Java source interpreter …...

    2024/4/19 11:55:22
  4. 从零开始手撸WebGL3D引擎3:基本渲染流程介绍

    写在前面 虽然一个渲染框架可能很复杂,但是如果我们一开始就把事情想的很复杂往往难以下手。另一方面,现在有很多开源引擎,你直接去看也会感觉难以入手。因为复杂性是由于需求而不断增加的,甚至有的复杂性是因为历史原因。本系列文章的初衷,是记录一个可用的,简单的WebGL…...

    2024/4/17 19:18:05
  5. mybatis SQL注入漏洞基本原理 以及处理方案

    mybatis 下的SQL注入问题简单来说,sql注入其实就是系统把用户输入的数据当做代码执行,导致程序上的错误或者是信息的泄露。mybastis提供了 “#”和”$” 两种符号进行动态传参:"#" 直接将传入参数添加引号,当作一个字符串进行拼接处理;"$" 则是将传入…...

    2024/4/17 19:16:29
  6. Excel实现像素画效果

    像素画就是一个个点构成,excel的表格天生就是无数个点,并且还可以涂色,正好合适! 图片获取每个点的RGB信息,可以使用point,也可以使用getpixel,但是这两种方法都奇慢无比。实际上point就是封装的getpixel。 最终选择使用GDI+来实现,可以秒读100w像素的照片RGB信息。 接…...

    2024/4/20 2:50:02
  7. Android异步消息处理机制完全解析

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9991569 之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了。惭愧!后面还会恢复进度,尽量保证每周都写吧。这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明…...

    2024/4/18 21:55:01
  8. 【JMeter】Groovy和BeanShell脚本的性能比较(转)

    比较完常见后置处理器的性能之后,又顺便比较了下Groovy和BeanShell 2者都是基于JVM的脚本语言,2者都能直接用Java的语法和类库 这些国外网站都推荐用Groovy: http://jmeter.apache.org/usermanual/best-practices.html http://www.ubik-ingenierie.com/blog/magento-perform…...

    2024/4/23 4:11:18
  9. 关于像素画的自动生成

    最近看独立游戏比较多,我慢慢了解到像素不单单是历史,他已经成为了一种艺术风格。 而很多像素游戏都在用点豆豆的方式制作。 刚好我具有一些图形学方面的知识,我认为这个制作方式是可以改变的,是可以从现存卡通形象直接生成像素图的。 不止是静态,包括动态的人物,都可以采…...

    2024/4/19 18:46:51
  10. SQL 注入基础系列3——判断sql注入点

    1 判断是否存在sql注入漏洞单引号判断法 在参数后加单引号http://xxx/abc.php?id=1如果页面返回错误,则存在 Sql 注入。 因为无论字符型还是整型都会因为单引号个数不匹配而报错。 (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语…...

    2024/4/11 20:49:36
  11. 用 WebGL 探索动画和交互技术(一个学习案例)

    价值 | 思考 | 共鸣简评:作者从理论到实践演示如何学习使用 WebGL 制作动画。约束过程 主要使用 three.js 和 GreenSock 库,这些实验都是手动编码的,没有凭借任何 3D 或动画软件。 这个过程包括以编程的方式塑造角色,一次一个方块。在精炼比例上我花费了大多数工夫。通过微…...

    2024/4/13 8:15:05
  12. 如何在STM32F429上使用DSP库

    在ST官网(http://www.st.com/content/st_com/en.html)下载STM32F4xx_DSP_StdPeriph_Lib_V1.8.0方法是在tool&software->MCUs Embedded Software->product Tree->STM32 Embedded Software->STM32 Standard Peripheral Libraries 里就可以找到上述库,STM32F4x…...

    2024/4/20 14:29:11
  13. Jmeter(三十四)_Beanshell解析并提取json响应

    1:前置条件 将fastjson-1.2.49.jar包置于jmeter的lib目录下,并将该jar包添加到测试计划的Library中;否则会报:Typed variable declaration : Class: JSONObject not found in namespace的错误2:解析思路 利用beanshell获取到json响应,然后通过JSONObject 和JSONArray 将数…...

    2024/4/20 2:45:02
  14. SQLiScanner:又一款基于SQLMAP和Charles的被动SQL 注入漏洞扫描工具

    项目地址:SQLiScanner简介叕一款基于SQLMAP和Charles的被动SQL 注入漏洞扫描工具从内部安全平台 分离出来的一个模块, 支持 Har 文件的扫描(搭配 Charles 使用: Tools=>Auto Save)特性 邮箱通知任务统计sqlmap 复现命令生成 依赖 Python 3.xDjango 1.9PostgreSQLCelerysql…...

    2024/4/18 5:37:55
  15. c3p0参数试探

    数据库最大连接数为20经常出现最大连接数错误[color=red]has exceeded the max_user_connections resource (current value: 20)[/color]c3p0.acquireIncrement=3c3p0.initialPoolSize=3c3p0.idleConnectionTestPeriod=60c3p0.minPoolSize=3c3p0.maxPoolSize=19c3p0.maxStateme…...

    2024/4/28 19:43:03
  16. unity项目build成webgl时选择生成目录(解决方法)

    在unity里点击File>>Build Settings...>>勾选你要生成的Scenes>>选择webgl>>后面Development Build不要勾选:点击build后会让你选择生成的目录,此处要慎重选择,否则会报错! 不要选择到项目所在目录,可以参照下图我的项目目录进行选择: 我的项目目…...

    2024/4/27 23:06:11
  17. STM32F429之一:新建HAL库工程模板

    资料 HAL库开发包(STM32Cube_FW_F4_V1.11.0) 和 MDK5.20新建工程 新建文件夹Template和子文件夹HALLIB、CORE、USRE和OBJ MDK新建工程,定位到USRE,选择芯片型号(MDK安装的对应pack)复制库文件 HALLIB:Drivers\STM32F4xx_HAL_Driver下:Src和Inc CORE:\Dri…...

    2024/4/28 4:45:14
  18. 39 WebGL着色器和着色器程序对象:initShader()函数的作用

    这一节,我们研究一下以前一直使用的辅助函数initShader()。 之前教程当中故意把这个函数中留到最后讲解,是为了确保学习initShaders()函数中的复杂细节时,对WebGL已经有了比较深入的了解。掌握这一部分内容不是必须的,直接使用initShaders()函数也能够编写出相当不错的WebG…...

    2024/4/29 1:47:02
  19. BeanShell PreProcessor

    目录1、使用场景2、相关参数1、使用场景,用来处理请求前的准备工作,如参数设置、环境变量设置等。2、相关参数参数项:参考BeanShell Timer实例:上图BeanShell脚本,调用Java类BeanShellEg,然后建两个变量“userName”、“address”,然后用BeanShellEg来赋值。可在其他取样…...

    2024/4/28 21:39:25
  20. STM32F429片上资源

    Core: Arm 32-bit Cortex-M4 CPU with FPU, RAM:256 KBytes (112+16+64+64)include 64-KB of CCM (core coupled memory) data RAM4 Kbytes of backup SRAM Flash Memory:2 MB of Flash memory Data Bus:32-bit data bus...

    2024/4/28 12:36:42

最新文章

  1. 数智新重庆 | 推进信号升格 打造算力山城

    2024年&#xff0c;是实现“十四五”规划目标任务的关键一年&#xff0c;高质量的5G网络、强大的AI能力作为新质生产力的重要组成部分&#xff0c;将有效赋能包括制造业在内的千行万业数字化化、智能化、绿色化转型升级&#xff0c;推动融合应用新业态、新模式蓬勃兴起&#xf…...

    2024/5/4 4:48:03
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. node.js常用指令

    1、node&#xff1a;启动 Node.js REPL&#xff08;交互式解释器&#xff09;。 node 2、node [文件名]&#xff1a;执行指定的 JavaScript 文件。 node app.js 3、npm init&#xff1a;初始化一个新的 Node.js 项目&#xff0c;生成 package.json 文件。 此命令会创建一个…...

    2024/5/3 8:55:58
  4. 问题解决:gorm查询oracle库表,返回struct字段数据为空的问题

    package model// 表对应的struct // github.com/cengsin/oracle v1.0.0 // gorm.io/gorm v1.21.16 // 注意&#xff1a;column:USERNAME字段必须大写&#xff08;oracle表中字段名大写&#xff09;&#xff0c;否则查询出的struct字段值会为空 type BBUser struct {Username …...

    2024/4/30 5:57:03
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57