Qt基于MainWindw界面双界面展示并打印副窗口操作

整合鼠标事件和键盘事件

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 放置一个按钮即可。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值