QWidget w://窗口
setWindowTitle("")//设置标题
=========================================
坐标机制
setGeometry(x,y,width,height)
========================================================
connect//信号槽函数
(
,//信号发出者
,//处理信号,&发送者的类型::信号
,信号接收者
,&接受者类型::信号
)
//自定义槽
槽函数要与信号一样,没有返回值
=========================================================================================
//自定义信号
声明时要加signals关键字
列如:
在窗口类a中
void sendsignal();
signals:
void mysignal();
void mysignal(int);
构造函数中
QPushButton b;
connect(b,&QPushButton::clicked,this,&sendsignal);
sendsignal()
{
emit mysignal();
emit mysignal(1);
}
//接收类
class Widget : public QWidget
{
Q_OBJECT
public:
QPushButton *b2=new QPushButton(this);
son *sonchild=new son();
Widget(QWidget *parent = 0);
~Widget();
void showaa();
void showaaa(int);
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(600,600);
this->move(200,100);
this->setWindowTitle("你好");
sonchild->show();
//如果存在信号重载的话,可以将信号转化为指针函数
void (son::*func)()=&son::backSignal;
connect(sonchild,func,this,&Widget::showaa);
void(son::*func)(int )=&son::backSignal;
connect(sonchild,func2,this,&Widget::showaa);
}
void Widget::showaa()
{
this->show();
}
void Widget::showaaa(1)
{
qDebug()<<"heiheihei";
}
============================================================
lamda处理信号
connect(&b,&QPushButton::clicked,
//方括号可以把外部变量传进来,
如果方阔号内是"=",则代表把外部所有的局部变量,类中所有成员以值传递
如果方括号内是"this",则代表将类中所有成员以值传递
如果方括号内是"&",则代表把外部所有局部变量引用进来
[]()
{
}
}
QGirdLayout layout(this);//网格布局
layout.addwidget();
或者:
setLayout(layout)
============================
样式表,语法与css类似
// 对单个控件;
ui->pushButton->setStyleSheet("QPushButton{border-radius:5px;background:rgb(150, 190, 60);color:red;font-size:15px;}")
// 对整个界面(包括界面上所有的控件)
this->setStyleSheet("QPushButton{border-radius:5px;background:rgb(150, 190, 60);color:red;font-size:15px; }
QToolButton{border-radius:5px;background:rgb(34, 231, 131);color:brown;font-size:15px;}")
===============================================
事件是被保护的方法
//鼠标按下抬起事件
void Widget::mousePressEvent(QMouseEvent *ev)
{
int x=ev->x();
int y=ev->y();//
ev->button()==Qt::LeftButton;
ev->button()==Qt::MidButton;
}
void Widget::dragMoveEvent(QDragMoveEvent *event)
{
}
void Widget::mouseMoveEvent(QMouseEvent *ev)
{
qDebug()<<ev->x()<<" "<<ev->y();
//不会一进来就有效,需要先点击一下.如果想一进来就有效,需要加上this->setMouseTracking(true);
}
//进入离开事件
//void Widget::enterEvent(QEvent *event)
//
//void Widget::leaveEvent(QEvent *event)
//{}
void Widget::keyPressEvent(QKeyEvent *event)
{
int value=event->key();
qDebug()<<(char)value;
value==Qt::Key_F1;//匹配
}
计时器事件
int id=this->startTimer(1000);
void Widget::timerEvent(QTimerEvent *event)
{
this->killTimer(id);//关闭定时器
}
void closeEvent(QCloseEvent *e)
{
int ret=QMessageBox::question(this,"question","are you sure to close?");
if(ret==Qt::yes)
{
e->ignore();//忽略这个事件,把它交给父窗口关闭
}
if(ret==Qt::No)
{
e->accept();//接收这个事件,不会再往下传递
}
}
=================================================
重写绘图事件
void paintEvent(QPaintEvent* paint);
void Widget::paintEvent(QPaintEvent* paint)
{
QPainter *p=new QPainter(this);
p->drawLine(10,10,50,50);//线
p->drawRect(10,10,50,50);//正方形
p->drawPixmap(0,0,QBitmap("E:\\source\\33.jpg"));//画图
}
在构造函数中重绘
this->update();
============================================
绘图设备
Qpixmap:针对屏幕进行优化,和平台相关
QImage:和平台无关,可以对 图片进行修改,在线程中绘图
QPicture:保存绘图的状态(二进制文件)
==============================================
捕获组合键
void MyWidget::keyPressEvent(QKeyEvent *event)
{
// 捕捉 Ctrl + Alt + A 组合键;先ctrl+alt
if (event->key() == Qt::Key_A && event->modifiers() == (Qt::AltModifier | Qt::ControlModifier))
{}
}
按键+鼠标组合,例如ctrl+左击(先ctrl后左击触发,先左击后ctrl不可触发):
void MyAPP::mousePressEvent(QMouseEvent *event)
{
if ((QApplication::keyboardModifiers() == Qt::ControlModifier) && (event->button() == Qt::LeftButton))
{
QMessageBox::aboutQt(NULL, "aboutQt");
}
}
按键+鼠标组合方法2,例如A+左击(先A后左击,先左击后A均可触发):
void MyAPP::keyPressEvent(QKeyEvent *event)
{
if ((event->key() == Qt::Key_A) && (QApplication::mouseButtons() == Qt::LeftButton))
{
QMessageBox::aboutQt(NULL, "aboutQt");
}
}