整合鼠标事件和键盘事件
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAction>
#include <QLabel>
#include <QDialog>
#include <QToolBar>
#include <QWidget.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QToolBar *bar;
private slots:
void on_action_OPen_triggered();
void setting();
void receiveData(QString,QString,QString,bool,bool);
void slotOpenFileDlg();
void on_actionSave_triggered();
void on_actionNew_triggered();
void on_actionCutrX_triggered();
void on_actionCutrC_triggered();
void on_actionCutrV_triggered();
void on_actionTextcolor_triggered();
void on_actionFont_setting_triggered();
void on_actionMove_triggered();
void on_actionMouse_triggered();
private:
Ui::MainWindow *ui;
QAction *setAction;
QLabel *label;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QAction"
#include "QMenu"
#include "QToolBar"
#include "QStatusBar"
#include "QIcon"
#include "QMessageBox"
#include "QDialog"
#include "QLabel"
#include "mydialog.h"
#include "QFileDialog"
#include "QDebug"
#include "QTextEdit"
#include "QColorDialog"
#include "QFontDialog"
#include "QWidget"
#include "widget.h"
#include "form.h"
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),
ui(new Ui::MainWindow)
{
/*setAction=new QAction(QIcon(""),tr("选项..."),this);
setAction->setStatusTip(tr("环境设定"));
connect(setAction,&QAction::triggered,this,&MainWindow::setting);
QMenu *tool=menuBar()->addMenu(tr("工具"));
tool->addAction(setAction);
QToolBar *toolBar=addToolBar(tr("工具"));
toolBar->addAction(setAction);
QStatusBar *status=statusBar();
status->addAction(setAction);
resize(500,500);
label=new QLabel("",this);
label->setGeometry(0,60,300,140);*/
ui->setupUi(this);
label=new QLabel("",this);
label->setGeometry(0,60,300,140);
// connect(bar,SIGNAL(triggered()),this,SLOT(on_actionTextcolor));
//connect(ui->actionMove, SIGNAL(triggered()), this, SLOT(on_actionMove_triggered()));
}
void MainWindow::setting()
{
myDialog *dialog=new myDialog(this);
connect(dialog,SIGNAL(sendData(QString,QString,QString,bool,bool)),
this,SLOT(rec(QString,QString,QString,bool,bool)));
dialog->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_action_OPen_triggered()
{
//QMessageBox::information(this,tr("Information"),tr("Open"));
myDialog *dialog=new myDialog;
#if 1
if(dialog->exec()==QDialog::Accepted)
{
QString s;
s="工程目录: "+dialog->getProjectPath()+"\n";
s=s+"编译环境: "+dialog->getCompiler()+"\n";
s=s+"高亮显示: "+dialog->getColorPlan()+"\n";
if(dialog->getIndent())
s=s+"智能缩进:是\n";
else
s=s+"智能缩进:否\n";
if(dialog->getAutoComplete())
s=s+"代码补全:是";
else
s=s+"代码补全:否";
ui->textEdit->setText(s);
}
#else
dialog->show();
connect(dialog,SIGNAL(sendData(QString,QString,QString,bool,bool)),
this,SLOT(rec(QString,QString,QString,bool,bool)));
#endif
}
void MainWindow::receiveData(QString a,QString b,QString c,bool d,bool e)
{
QString s;
s="工程目录: "+a+"\n";
s=s+"编译环境: "+b+"\n";
s=s+"高亮显示: "+c+"\n";
if(d)
s=s+"智能缩进:是\n";
else
s=s+"智能缩进:否\n";
if(e)
s=s+"代码补全:是";
else
s=s+"代码补全:否";
ui->textEdit->setText(s);
}
void MainWindow::on_actionSave_triggered()
{
//resize(200,150);
//bar=new QToolBar("File Dialog",this);
//connect(bar,SIGNAL(triggered()),this,SLOT(slotOpenFileDlg));
QString s= QFileDialog::getOpenFileName(
this,
"open file dialog",
"/",
"C++ files(*.cpp);;C files(*.c);;Head files(*files(*.h)");
ui->textEdit->setText(s);
}
void MainWindow::slotOpenFileDlg()
{
/* QString s= QFileDialog::getOpenFileName(
this,
"open file dialog",
"/",
"C++ files(*.cpp);;C files(*.c);;Head files(*files(*.h)");
qDebug()<<s;
*/
}
void MainWindow::on_actionNew_triggered()
{
ui->textEdit->clear();
}
void MainWindow::on_actionCutrX_triggered()
{
qDebug()<<"cutText";
ui->textEdit->cut();
}
void MainWindow::on_actionCutrC_triggered()
{
qDebug()<<"copyText";
ui->textEdit->copy();
}
void MainWindow::on_actionCutrV_triggered()
{
qDebug()<<"pasteText";
ui->textEdit->paste();
}
void MainWindow::on_actionTextcolor_triggered()
{
QColor color=QColorDialog::getColor(Qt::blue);
if(color.isValid())
{
int r,g,b;
color.getRgb(&r,&g,&b);
qDebug()<<r<<" "<<g<<" "<<b;
ui->textEdit->setTextColor(color);
}
}
void MainWindow::on_actionFont_setting_triggered()
{
bool ok;
QFont font=QFontDialog::getFont(&ok);
if(ok)
{
ui->textEdit->setCurrentFont(font);
}
}
void MainWindow::on_actionMove_triggered()
{
Widget *widget = new Widget;
widget->show();
}
void MainWindow::on_actionMouse_triggered()
{
Form *form = new Form;
form->show();
}
创建mydialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
namespace Ui {
class myDialog;
}
class myDialog : public QDialog
{
Q_OBJECT
public:
explicit myDialog(QWidget *parent = 0);
~myDialog();
QString getProjectPath();
QString getCompiler();
QString getColorPlan();
bool getIndent();
bool getAutoComplete();
signals:
void sendData(QString,QString,QString,bool,bool);
private slots:
void on_buttonBox_accepted();
void on_pushButton_clicked();
private:
Ui::myDialog *ui;
};
#endif // MYDIALOG_H
mydialog.cpp
#include "mydialog.h"
#include "ui_mydialog.h"
#include "QFileDialog"
myDialog::myDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::myDialog)
{
ui->setupUi(this);
}
myDialog::~myDialog()
{
delete ui;
}
QString myDialog::getProjectPath()
{
QString s=ui->lineEdit->text();
return s;
}
QString myDialog::getCompiler()
{
if(ui->radioButton->isChecked())
return QString("VC++ 6.0");
else if(ui->radioButton_2->isChecked())
return QString("VC++ 2012");
else
return QString("g++");
}
QString myDialog::getColorPlan()
{
QListWidgetItem *it=ui->listWidget->currentItem();
return it->text();
}
bool myDialog::getIndent()
{
if(ui->checkBox->isChecked())
return true;
else
return false;
}
bool myDialog::getAutoComplete()
{
if(ui->checkBox_2->isChecked())
return true;
else
return false;
}
void myDialog::on_buttonBox_accepted()
{
QString s1=ui->lineEdit->text();
QString s2;
if(ui->radioButton->isChecked())
s2=QString("VC++ 6.0");
else if(ui->radioButton_2->isChecked())
s2=QString("VC++ 2012");
else
s2=QString("g++");
QListWidgetItem *it=ui->listWidget->currentItem();
QString s3=it->text();
bool b1=ui->checkBox->isChecked();
bool b2=ui->checkBox_2->isChecked();
emit sendData(s1,s2,s3,b1,b2);
}
/*void myDialog::on_pushButton_clicked()
{
QString s= QFileDialog::getOpenFileName(
this,
"open file dialog",
"/",
"C++ files(*.cpp);;C files(*.c);;Head files(*files(*.h)");
ui->lineEdit->setText(s);
}*/
创建鼠标事件form.h
#ifndef FORM_H
#define FORM_H
#include <QWidget>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = 0);
~Form();
private:
Ui::Form *ui;
};
#endif // FORM_H
form.cpp
#include "form.h"
#include "ui_form.h"
#include "mylabel.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
myLabel *label = new myLabel(this); // 创建标签对象
label->setAlignment(Qt::AlignCenter); // 设置对齐方式
label->resize(260, 150);
label->show();
}
Form::~Form()
{
delete ui;
}
创建mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
#include <QMouseEvent>
class myLabel : public QLabel
{
public:
myLabel(QWidget *);
protected:
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
private:
bool moving;
QPoint lastPos;
};
#endif // MYLABEL_H
mydialog.cpp
#include "mylabel.h"
#include "form.h"
/*myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}
void myLabel::mousePressEvent(QMouseEvent *ev)
{
// 显示鼠标位置
setText(QString("Press: %1, %2").arg(QString::number(ev->x()),
QString::number(ev->y())));
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
// 显示鼠标位置
setText(QString("Release: %1, %2").arg(
QString::number(ev->x()), QString::number(ev->y())));
}
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
// 显示鼠标位置
setText(QString("Move: %1, %2").arg(
QString::number(ev->x()), QString::number(ev->y())));
}*/
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
moving = false;
}
void myLabel::mousePressEvent(QMouseEvent *ev)
{
// 显示鼠标位置
setText(QString("Press: %1, %2").arg(QString::number(ev->x()),
QString::number(ev->y())));
// 记录鼠标点击时的位置
lastPos = ev->globalPos();
// 进入移动状态
moving = true;
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
// 显示鼠标位置
setText(QString("Release: %1, %2").arg(
QString::number(ev->x()), QString::number(ev->y())));
// 退出移动状态
moving = false;
}
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
// 显示鼠标位置
setText(QString("Move: %1, %2").arg(
QString::number(ev->x()), QString::number(ev->y())));
// 如果处于移动状态,则移动label
if (moving) {
// 计算鼠标移动的距离
QPoint delta = ev->globalPos() - lastPos;
// 更新label的位置
QPoint new_pos = this->pos() + delta;
this->move(new_pos);
// 更新lastPos为当前鼠标位置
lastPos = ev->globalPos();
}
}
键盘事件创建widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
QPushButton *btn;
protected:
void keyPressEvent(QKeyEvent *);
void moveRandomDirection();
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "QKeyEvent"
#include "QApplication"
#include "QTimer"
#include "QTime"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
resize(500,500);
btn = new QPushButton("可移动", this);
btn->setGeometry(40,40,60,30); // 设置按钮位置
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(moveRandomDirection()));
timer->start(1000); // 每秒触发一次定时器
}
Widget::~Widget()
{
delete ui;
}
void Widget::keyPressEvent(QKeyEvent *e)
{
int x = btn->x(); //获取按钮x坐标
int y = btn->y(); //获取按钮y坐标
int step = QApplication::keyboardModifiers() & Qt::ControlModifier ? 5:10;
switch (e->key())
{
case Qt::Key_W :
if(y - step >= 10)
{
btn->move(x, y-step);
break;
}
case Qt::Key_S :
if(y + step <= 200)
{
btn->move(x, y+step);
break;
}
case Qt::Key_A :
if(x - step >= 10)
{
btn->move(x-step, y);
break;
}
case Qt::Key_D:
if(x + step <= 200)
{
btn->move(x+step, y);
break;
}
}
}
/*void Widget::moveRandomDirection()
{
int x = btn->x(); // 获取按钮x坐标
int y = btn->y(); // 获取按钮y坐标
int step = 10; // 移动步长
// 生成随机方向
int direction = QTime::currentTime().msec() % 4;
switch (direction)
{
case 0: // Up
if (y - step >= 10)
btn->move(x, y - step);
break;
case 1: // Down
if (y + step <= 200)
btn->move(x, y + step);
break;
case 2: // Left
if (x - step >= 10)
btn->move(x - step, y);
break;
case 3: // Right
if (x + step <= 200)
btn->move(x + step, y);
break;
}
}*/
mainwindow.ui
mydialog.ui
widget.ui 放置一个按钮即可。