0.QT中QWidget、QDialog及QMainWindow的区别
QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、 键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个 窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通 常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单、工具条和一个状态条 。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用 户点击菜单项或者工具条按钮时,槽会被调用。
QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。 QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。它们可以有 默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。
QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下 ,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能 没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口。
如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有 可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。
当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等 等。
QWidget是所有widget的基类, 自定义窗口
QDialog提供一个对话框
QMainWindow提供一个主窗口,包括菜单栏等
一般来说,你如果是顶级窗体(不嵌入到其它窗体里面的)上有菜单,有状态栏等,就用QMainWindow, 如果是顶级窗体,但没有菜单、状态栏等,就用QDialog,如果你不确定,则用QWidget (它可以嵌入到其 它容器部件或窗体里面)
1.QT中简单的画线
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter paint(this);
paint.setPen(Qt::red);
paint.drawLine(0,50,50,50);
}
在h文件中记得添加void paintEvent(QPaintEvent *event);
(只能用paintEvent 这个名字,改成其它名字是不能画线,如果在控件上画图 就要将this 改为控件名)
2.解决中文乱码
在main.cpp中添加:QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
(utf-8或gb2312) 其他的地方最好不要再使用了
3.在界面中获取鼠标的坐标位置
在头文件中添加:
#include<QMouseEvent>
public:
void mousePressEvent(QMouseEvent *event);
在*.cpp文件中添加
#include <QDebug>
void FiveChess::mousePressEvent(QMouseEvent *event)
{
if(event->button() ==Qt::LeftButton)//不加这行也可以,左右键一样的效果
{
qDebug() << "("<< event->x() <<","<<event->y()<< ")"<< endl;
}
}
4.在界面中某一个位置载入图片
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPixmap pixmap;
pixmap.load(":/res/Table.bmp");
QPainter painter(this);
painter.drawPixmap(0,0,pixmap);
painter.end();
}
5.载入图片,在上面画线
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPixmap pixmap;
pixmap.load(":/res/Table.bmp");
QPainter painter(this);
painter.drawPixmap(0,0,pixmap);
painter.end();
QPainter llpainter(this);
llpainter.setPen( QPen( Qt::red, 2, Qt::SolidLine ) );
llpainter.drawLine( 0, 0, 350, 120 );
llpainter.end();
}
或者
void FiveChess::paintEvent(QPaintEvent *)
{
QPixmap pixmap;
pixmap.load(":/res/Table.bmp");
QPainter llpainter(&pixmap);
llpainter.setPen( QPen( Qt::red, 2, Qt::SolidLine ) );
llpainter.drawLine( 0, 0, 350, 120 );
llpainter.end();
QPainter painter(this);
painter.drawPixmap(0,0,pixmap);
painter.end();
}
6.在一个图片上,任意位置载入另一个图片
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPixmap pixmap1;
QPainter painter(this);
pixmap1.load(":/res/Table.bmp");
painter.drawPixmap(0,0,pixmap1);
painter.end();
QPixmap pixmap2;
pixmap2.load(":/res/White.bmp");
painter.drawPixmap(0,0,pixmap2);
painter.end();
}
或者
在构造函数中添加
QPixmap pixmap;
QPainter painter(this);
pixmap.load(":/res/Table.bmp");
painter.drawPixmap(0,0,pixmap);
painter.end();
在空白的地方添加:
void FiveChess::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pixmap;
pixmap.load(":/res/White.bmp");
painter.drawPixmap(0,0,pixmap);
painter.end();
}
7.在界面上,显示一个图片可以指定宽和高
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(“:/res/linux.jpg”);
//以(0,0)点开始的宽和高都为100的矩形中显示该图片
painter.drawPixmap(0,0,100,100,pix);
painter.end();
}
8.在界面上,翻转一个图片
9.在界面上,图片的扭曲
10.在一个图片上,某个位置上画一个圆形
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pixmap;
pixmap.load(":/res/Table.bmp");
painter.drawPixmap(0,0,pixmap);
painter.end();
QPainter p(this);
QPainterPath path;
path.addEllipse(10,10,50,50); // 向path 中添加图形
p.setPen(Qt::black);
p.setBrush(Qt::white);
p.drawPath(path); // 绘制前面创建的path
}
或者
void FiveChess::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pixmap;
pixmap.load(":/res/Table.bmp");
painter.drawPixmap(0,0,pixmap);
painter.end();
QPainter p(this);
p.setPen(Qt::black);
p.setBrush(Qt::white);
p.drawEllipse(10,10,20,20);
}
或者
void FiveChess::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pixmap;
pixmap.load(":/res/Table.bmp");
painter.drawPixmap(0,0,pixmap);
painter.end();
QPainter painter(this);
QPoint pos(100,100);
painter.setPen(Qt::black); //画笔的颜色即边缘的颜色
painter.setBrush(Qt::white); //画刷的颜色即填充的颜色
painter.drawEllipse(pos,10,10);
}
11.在一个图片上,某个位置上画一个矩形
所有的同上,只需要将*.draw*(*)代替为*.drawRect(*)即可
12.在界面的某个位置上画一个圆形
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
#include <QPoint>
void FiveChess::paintEvent(QPaintEvent *) //圆点坐标位置+半径
{
QPainter painter(this);
QPoint pos(100,100);
painter.setPen(Qt::black);
painter.setBrush(Qt::white);
painter.drawEllipse(pos,10,10);
}
或者
void FiveChess::paintEvent(QPaintEvent *) //矩形的左上角和右下角点坐标
{
QPainter painter(this);
painter.setPen(Qt::black);
painter.setBrush(Qt::white);
painter.drawEllipse(10,10,20,20);
}
或者
void FiveChess::paintEvent(QPaintEvent *) //矩形的左上角和右下角点坐标
{
QPainterPath path;
QPainter painter(this);
path.addEllipse(10,10,50,50); // 向path 中添加图形
painter.setPen(Qt::black);
painter.setBrush(Qt::white);
painter.drawPath(path); // 绘制前面创建的path
}
13.在界面的某个位置上画一个矩形
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPainter painter(this); // 创建QPainter一个对象
QPen pen;
// 画一个空心矩形
pen.setColor(Qt::darkRed);
painter.setPen(pen);
//在坐标为(100,100)的位置以右上角为起始点,画一个宽高都为28的矩形
painter.drawRect(QRect(100, 100, 28, 28));
}
14.在界面上,画一条路径
15.在界面上,实现图片的缩放
16.在Qt Designer中,在状态栏中添加图标
在"Action Editor"中,双击某个选项, 为某个Action添加图标,
然后用鼠标点击该选项,拖到上面的界面中的状态栏即可
17.在Qt Designer中,固定状态栏
选中状态栏,在右下角出现它的属性,在属性中找到"movable"选项,去掉勾,即可
18.去掉不用的资源文件,但是去掉后不能运行
删除工作目录中debug,release文件夹,在qt Creator中依次使用qmake,run即可.
19.为MainWindow窗口中菜单栏中子选项添加相应的函数
在"Action Editor"中,单击选中某个选项,右键选中"go to slot..",一般生成的函数名叫 on_action_SAVE_triggered(),编译器自动在class中和*.cpp文件中生成相应的内容.
20.qt多窗口程序设计
新建一个工程Base class为:MainWindow, 然后在该工程名上,右键"Add New"--> "Qt"
-->"Qt designer from class" -->"Choose" ...
在要使用该界面的文件*.cpp中添加:
#include "mydialog.h" //添加时,自动生成的
#include "ui_mydialog.h" //可以任意修改界面,自动生成相应的代码
void MainWindow::on_pushButton_clicked() //主窗口的一个按键的点击事件
{
MyDialog dlg;
dlg.exec();
}
21.在屏幕中央显示界面
在main函数中添加如下代码:
#include <QDesktopWidget>
MainWindow w; //根据实际情况更改
w.move((QApplication::desktop()->width() - w.width())/2,
(QApplication::desktop()->height() - w.height())/2);
22.加载的图片,覆盖了工具栏
在UI文件中用鼠标选中工具栏,找到"autoFillBackground"打勾 即可
或者
在构造函数中添加 ui->mainToolBar->setAutoFillBackground(true);
23.在主界面中添加一个回滚区域(scrollArea),大小随主界面变化
ui->scrollArea->setBackgroundRole(QPalette::Dark); //该行仅仅是设置背景颜色
this->setCentralWidget(ui->scrollArea); //添加该行即可
24.在界面上添加一个滚动区域,然后在该区域内显示一幅图片
在类中添加:
private:
QLabel *imageLabel;
QScrollArea *scrollArea; //滚动区域
在*.cpp构造函数中添加:
scrollArea = new QScrollArea; //滚动区域
scrollArea ->setBackgroundRole(QPalette::Dark);
setCentralWidget(scrollArea);
this->setCentralWidget(scrollArea);
imageLabel =new QLabel;
imageLabel ->setBackgroundRole(QPalette::NoRole); /*QPalette::Base--基本的颜色(白色 // ) QPalette::NoRole--继承父类框的背景风格 */
imageLabel ->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
imageLabel ->setScaledContents(true); //选择自动适应框的变化,就是无论将对话框,缩小 // ,放大都不影响像素,作用在看图片的时候,图片的像素会跟着相框调整
scrollArea->setWidget(imageLabel);
scrollArea->setBackgroundRole(QPalette::Dark);
(如果在滚动区域有一个label的小区域, 将 createActions(); createMenus();等放在上述内容 之后)
25.qt中,如果删除了某个不必要的文件,但以前是编译到工程中的文件,出错
首先 "Save"-->"Clean project"-->"qmake"-->"make"
36.qt为应用程序添加图标
在MainFram目录下添加一个文件appICO.rc,内容如下:
IDI_ICON1 ICON DISCARDABLE "./res/qt.ico"
(上面的qt图片只能是ICO格式,并且文件大小写敏感)
在*.pro中添加: (一定要亲手添加)
OTHER_FILES+= \
MainFram/apprc.rc #这个文件系统根据appICO生成的
RC_FILE=\
MainFram/appICO.rc
然后 $ make distclean
$ qmake
$ make
37.画彩色的线条
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter paint(this);
paint.setPen(Qt::red);
paint.drawLine(0,50,50,50);
}
*.h文件中记得添加void paintEvent(QPaintEvent *event);
而且只能用paintEvent 这个名字,改成其它名字是不能画线的哦
38.qt去掉标题栏
在构造函数中添加:
setWindowFlags(Qt::FramelessWindowHint);
39.qt使用鼠标移动窗体(一般使用鼠标只能点标题栏才能移动窗体)
在*.h文件中类中添加:
public:
QPoint last,pos0;//窗口移动处理
protected:
void mouseMoveEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *);
在*.cpp文件中添加:
void Dialog::mousePressEvent(QMouseEvent *e)
{
last = e->globalPos();
pos0 = e->globalPos() - e->pos();
}
void Dialog::mouseMoveEvent(QMouseEvent *e)
{
QPoint newpos = e->globalPos();
QPoint upleft = pos0 + newpos - last;
move(upleft);
}
40.qt界面中"关于"对话框设计
QMessageBox message(QMessageBox::NoIcon, "ImageProcess", tr("<p><b>数字图像处理 V0.10</b></p> \ <p>作者:董亮 WTU CS0921</p>"));
message.setIconPixmap(QPixmap(":/res/qt.ico"));
message.exec();
//<p></p>换行 <b></b>粗体
41.Qt标准对话框
QMessageBox::critical(NULL, “critical”, “Content”, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::warning(NULL, “warning”, “Content”, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::question(NULL, “question”, “Content”, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::about(NULL, “About”, “About this application”);
42.Qt中调用UI文件中的控件,如下:
QObject::connect(ui->startButton, SIGNAL(clicked()),this, SLOT(startGame()));
其中clicked()函数必须在类声明为:private signals
startGame()函数必须在类声明为:private slots
43.Qt去掉dialog标题栏的问号
在构造函数中添加:setWindowFlags(Qt::WindowCloseButtonHint);
44.qt五子棋在UI界面上下棋
在头文件中添加:
#include <QPixmap>
#include <QPainter>
public:
void paintEvent(QPaintEvent *);
在*.cpp文件中添加
void FiveChess::paintEvent(QPaintEvent *)
{
QPixmap pixmap1;
QPainter painter(this);
pixmap1.load(":/res/Table.png");
painter.drawPixmap(10,10,pixmap1);
QPixmap pixmap2;
pixmap2.load(":/res/white.png");
painter.drawPixmap(60,83,pixmap2); //棋子1
painter.drawPixmap(100,83,pixmap2); //棋子2
}