Qt學習時間已經接近兩個月的時間了
在這一月的學習收獲比較大
從學習中個人感覺只有項目能讓你的成長加速
下面是我個人寫了一天的項目的成果
在這個項目中得到了旁邊同學的指點才得以將一些困難解決
在這個程序中我也深深體會到DEBUG()這個函數的重要性
程序雖簡單但要調試出還是有點麻煩的,有很多細節都需要考慮
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QtGui>
6
7
8 namespace Ui {
9 class MainWindow;
10 }
11
12 class MainWindow : public QMainWindow
13 {
14 Q_OBJECT
15
16 public:
17 explicit MainWindow(QWidget *parent = 0);
18 ~MainWindow();
19
20
21 enum DrawType{None, Line, Rect, Ellipse};
22
23 protected:
24 void paintEvent(QPaintEvent *);
25 void mousePressEvent(QMouseEvent *);
26 void mouseReleaseEvent(QMouseEvent *);
27 void mouseMoveEvent(QMouseEvent *);
28 void paint(QPixmap &thePixmap);
29
30
31 private slots:
32 void on_horizontalSlider_valueChanged(int value);
33
34 private:
35 Ui::MainWindow *ui;
36 QPainter *painter;
37 QPixmap pixmap;
38 QPixmap tempPixmap;
39 QPoint firstPoint;
40 QPoint secondPoint;
41 QPen pen;
42 QBrush brush;
43 QColor backColor;
44 QColor penColor;
45 QColor brushColor;
46 Qt::PenStyle penStyle;
47 int penWidth;
48
49 int x;
50 int y;
51 int w;
52 int h;
53
54 DrawType drawType;
55 bool isDrawing;
56
57 QAction *openFileAction;
58
59 private slots:
60 void on_comboBoxPen_currentIndexChanged(int index);
61 void on_comboBoxBrush_currentIndexChanged(int index);
62 void on_solidlineAction_triggered();
63 void on_openFileAction_triggered();
64 void on_saveAction_triggered();
65 void on_dottedAction_triggered();
66 void on_colorAction_triggered();
67 void on_rectAction_triggered();
68 void on_clearAction_triggered();
69 void on_ellipseAction_triggered();
70 void on_lineAction_triggered();
71 void on_comboBox_currentIndexChanged(int index);
72 };
73
74 #endif // MAINWINDOW_H
這個是頭文件的編寫,沒什么好說的
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(tr("Qt畫板"));
QPixmap pix(16,16);
QPainter painter(&pix);
painter.fillRect(0,0,16,16,Qt::black); //先繪制一個16*16的小圖片,然后給其塗色
ui->comboBoxPen->addItem(QIcon(pix),tr("黑色"),Qt::black); //再用該圖片作為組合框條目的圖標
ui->comboBoxBrush->addItem(QIcon(pix),tr("黑色"),Qt::black);
painter.fillRect(0,0,16,16,Qt::white);
ui->comboBoxPen->addItem(QIcon(pix),tr("白色"),Qt::white);
ui->comboBoxBrush->addItem(QIcon(pix),tr("白色"),Qt::white);
painter.fillRect(0,0,16,16,Qt::red);
ui->comboBoxPen->addItem(QIcon(pix),tr("紅色"),Qt::red);
ui->comboBoxBrush->addItem(QIcon(pix),tr("紅色"),Qt::red);
painter.fillRect(0,0,16,16,Qt::green);
ui->comboBoxPen->addItem(QIcon(pix),tr("綠色"),Qt::green);
ui->comboBoxBrush->addItem(QIcon(pix),tr("綠色"),Qt::green);
painter.fillRect(0,0,16,16,Qt::blue);
ui->comboBoxPen->addItem(QIcon(pix),tr("藍色"),Qt::blue);
ui->comboBoxBrush->addItem(QIcon(pix),tr("藍色"),Qt::blue);
painter.fillRect(0,0,16,16,Qt::yellow);
ui->comboBoxPen->addItem(QIcon(pix),tr("黃色"),Qt::yellow);
ui->comboBoxBrush->addItem(QIcon(pix),tr("黃色"),Qt::yellow);
ui->comboBoxPen->addItem(tr("無顏色"),Qt::transparent); //即透明
ui->comboBoxBrush->addItem(tr("無顏色"),Qt::transparent);
ui->openFileAction->setIcon(QIcon(":/png/open.png"));
ui->openFileAction->setStatusTip(tr("openFile"));
ui->mainToolBar->addAction(ui->openFileAction);
ui->saveAction->setIcon(QIcon(":/png/save.png"));
ui->saveAction->setStatusTip(tr("save"));
ui->mainToolBar->addAction(ui->saveAction);
ui->exitAction->setIcon(QIcon(":/png/exit.png"));
ui->exitAction->setStatusTip(tr("exit"));
ui->mainToolBar->addAction(ui->exitAction);
ui->colorAction->setIcon(QIcon(":/png/color.png"));
ui->colorAction->setStatusTip(tr("Pixmap Color"));
ui->mainToolBar->addAction(ui->colorAction);
ui->clearAction->setIcon(QIcon(":/png/clear.png"));
ui->clearAction->setStatusTip(tr("clear"));
ui->mainToolBar->addAction(ui->clearAction);
ui->lineAction->setIcon(QIcon(":/png/line.png"));
ui->lineAction->setStatusTip(tr("line"));
ui->mainToolBar->addAction(ui->lineAction);
ui->rectAction->setIcon(QIcon(":/png/rect.png"));
ui->rectAction->setStatusTip(tr("rect"));
ui->mainToolBar->addAction(ui->rectAction);
ui->ellipseAction->setIcon(QIcon(":/png/ellipse.png"));
ui->ellipseAction->setStatusTip(tr("ellipse"));
ui->mainToolBar->addAction(ui->ellipseAction);
ui->dottedAction->setIcon(QIcon(":/png/dotted.png"));
ui->dottedAction->setStatusTip(tr("dotted"));
ui->mainToolBar->addAction(ui->dottedAction);
ui->solidlineAction->setIcon(QIcon(":/png/solidline.png"));
ui->solidlineAction->setStatusTip(tr("solidline"));
ui->mainToolBar->addAction(ui->solidlineAction);
pixmap = QPixmap(500,400);
pixmap.fill(Qt::white);
backColor = QColor(Qt::white);
firstPoint = QPoint(0,0);
secondPoint = QPoint(0,0);
brushColor = Qt::red;
tempPixmap.fill(backColor);
penWidth = 1;
isDrawing = false;
}
構造函數中對控件的控制
其中下面的的這段代碼是,我第一次用的方式,就是各一個COMBOBOX潛入顏色的選擇
1 QPixmap pix(16,16);
2 QPainter painter(&pix);
3
4 painter.fillRect(0,0,16,16,Qt::black); //先繪制一個16*16的小圖片,然后給其塗色
5 ui->comboBoxPen->addItem(QIcon(pix),tr("黑色"),Qt::black); //再用該圖片作為組合框條目的圖標
6 ui->comboBoxBrush->addItem(QIcon(pix),tr("黑色"),Qt::black);
7 painter.fillRect(0,0,16,16,Qt::white);
8 ui->comboBoxPen->addItem(QIcon(pix),tr("白色"),Qt::white);
9 ui->comboBoxBrush->addItem(QIcon(pix),tr("白色"),Qt::white);
10 painter.fillRect(0,0,16,16,Qt::red);
11 ui->comboBoxPen->addItem(QIcon(pix),tr("紅色"),Qt::red);
12 ui->comboBoxBrush->addItem(QIcon(pix),tr("紅色"),Qt::red);
13 painter.fillRect(0,0,16,16,Qt::green);
14 ui->comboBoxPen->addItem(QIcon(pix),tr("綠色"),Qt::green);
15 ui->comboBoxBrush->addItem(QIcon(pix),tr("綠色"),Qt::green);
16 painter.fillRect(0,0,16,16,Qt::blue);
17 ui->comboBoxPen->addItem(QIcon(pix),tr("藍色"),Qt::blue);
18 ui->comboBoxBrush->addItem(QIcon(pix),tr("藍色"),Qt::blue);
19 painter.fillRect(0,0,16,16,Qt::yellow);
20 ui->comboBoxPen->addItem(QIcon(pix),tr("黃色"),Qt::yellow);
21 ui->comboBoxBrush->addItem(QIcon(pix),tr("黃色"),Qt::yellow);
22
23 ui->comboBoxPen->addItem(tr("無顏色"),Qt::transparent); //即透明
24 ui->comboBoxBrush->addItem(tr("無顏色"),Qt::transparent);
如果要在COMBOBOX中選擇顏色,這里有個技巧QColorcolor=ui->comboBoxBrush->itemData(index,Qt::UserRole).value<QColor>();讀取顏色
1 void MainWindow::on_comboBoxBrush_currentIndexChanged(int index)
2 {
3 QColor color = ui->comboBoxBrush->itemData(index,Qt::UserRole).value<QColor>();
4 brushColor = color;
5 brush.setColor(brushColor);
6 qDebug()<<brush.color();
7 }
事件的實現
1 void MainWindow::paintEvent(QPaintEvent *event)
2 {
3 painter = new QPainter(this);
4
5 //QPainter draw(&pixmap);
6 //pen.setCapStyle(Qt::RoundCap);
7 //painter->setBrush(brushColor);
8 if(isDrawing)
9 {
10 painter->drawPixmap(0,60,tempPixmap);
11 }
12 else
13 {
14 painter->drawPixmap(0,60,pixmap);
15 }
16
17 }
鼠標的狀態讀取
1 void MainWindow::mousePressEvent(QMouseEvent *event)
2 {
3 if(event->button() == Qt::LeftButton)
4 {
5 qDebug()<<"left press";
6 firstPoint = event->pos();
7 isDrawing = true;
8 }
9 update();
10 }
11
12 void MainWindow::mouseReleaseEvent(QMouseEvent *event)
13 {
14 if(event->button() == Qt::LeftButton)
15 {
16 secondPoint = event->pos();
17 paint(pixmap);
18 isDrawing = false;
19 }
20 update();
21 }
22 void MainWindow::mouseMoveEvent(QMouseEvent *event)
23 {
24 qDebug()<<event->button();
25 //if(event->button()==Qt::LeftButton)
26 {
27 secondPoint = event->pos();
28
29 //paint(pixmap);
30 if(drawType == None)
31 {
32 paint(pixmap);
33 isDrawing = false;
34 }
35 else
36 {
37
38 tempPixmap = pixmap;
39 paint(tempPixmap);
40 }
41 }
42 update();
43 }
幾個控件的槽機制的實現
1 void MainWindow::on_horizontalSlider_valueChanged(int value)
2 {
3 penWidth = value;
4 pen.setWidth(penWidth);
5
6 }
7
8 void MainWindow::on_comboBoxPen_currentIndexChanged(int index)
9 {
10 QColor color = ui->comboBoxPen->itemData(index,Qt::UserRole).value<QColor>();
11 penColor = color;
12 pen.setColor(penColor);
13
14 }
15
16
17
18 void MainWindow::on_comboBoxBrush_currentIndexChanged(int index)
19 {
20 QColor color = ui->comboBoxBrush->itemData(index,Qt::UserRole).value<QColor>();
21 brushColor = color;
22 brush.setColor(brushColor);
23 qDebug()<<brush.color();
24 }
25
26 void MainWindow::on_solidlineAction_triggered()
27 {
28 penStyle = Qt::SolidLine;
29 pen.setStyle(penStyle);
30
31 }
1 void MainWindow::on_dottedAction_triggered()
2 {
3 penStyle = Qt::DotLine;
4 pen.setStyle(penStyle);
5
6 }
7
8 void MainWindow::on_colorAction_triggered()
9 {
10 QColor color = QColorDialog::getColor(Qt::yellow,this);
11
12
13 if(color.isValid())
14 {
15 pixmap.fill(color);
16 backColor = color;
17 }
18 }
19
20 void MainWindow::on_rectAction_triggered()
21 {
22 drawType = Rect;
23 }
24
25 void MainWindow::on_clearAction_triggered()
26 {
27 pixmap.fill(backColor);
28 update();
29 }
30
31 void MainWindow::on_ellipseAction_triggered()
32 {
33 drawType = Ellipse;
34 }
1 void MainWindow::on_openFileAction_triggered()
2 {
3 QFileDialog *file= new QFileDialog(this,"Open");
4
5 file->setFilter("PNG(*.png);JPG(*.jpg)");
6 file->setDirectory("d:/learn/");
7 file->setFileMode(QFileDialog::ExistingFiles);
8 file->setViewMode(QFileDialog::List);
9 file->resize(320,240);
10 if(file->exec()==QFileDialog::Accepted)
11 {
12 QString fileName = (file->selectedFiles().at(0));
13 if(!fileName.isEmpty())
14 {
15 pixmap.load(fileName);
16 //painter->translate(50,70);
17 painter->drawPixmap(0,60,pixmap.width(),pixmap.height(),pixmap);
18 }
19 }
20 }
21
22 void MainWindow::on_saveAction_triggered()
23 {
24 QFileDialog *file = new QFileDialog(this,"Save As");
25 file->setAcceptMode(QFileDialog::AcceptSave);//系統默認保存的界面是打開,這句將其改為保存按鈕
26 file->setFilter("JPG(.jpg)");
27 file->setFileMode(QFileDialog::AnyFile);
28
29 file->resize(320,240);
30
31 if(file->exec() == QFileDialog::Accepted)
32 {
33 QString fileName = file->selectedFiles().at(0);
34
35 qDebug()<<fileName;
36
37 if(pixmap.save(fileName))
38 {
39 qDebug()<<"save success";
40 }
41 else
42 {
43 qDebug()<<"save error";
44 }
45 }
1 void MainWindow::on_lineAction_triggered()
2 {
3 drawType = Line;
4 }
5
6 void MainWindow::on_comboBox_currentIndexChanged(int index)
7 {
8 ui->horizontalSlider->setValue(index);
9 }
1 void MainWindow::paint(QPixmap &thePixmap)
2 {
3 QPainter draw(&thePixmap);
4 draw.setPen(pen);
5 draw.setBrush(brushColor);
6 x = firstPoint.x();
7 y = firstPoint.y();
8 w = secondPoint.x()-x;
9 h = secondPoint.y()-y;
10
11 switch(drawType)
12 {
13 case None:
14 draw.drawLine(x,y-60,secondPoint.x(),secondPoint.y()-60);
15 firstPoint = secondPoint;
16 break;
17 case Line:
18 draw.drawLine(x,y-60,secondPoint.x(),secondPoint.y()-60);
19 break;
20 case Rect:
21 draw.drawRect(x,y-60,w,h);
22 break;
23 case Ellipse:
24 draw.drawEllipse(x,y-60,w,h);
25 break;
26 }
27 update();
28 }