QT日常代码二

本文介绍如何使用Qt创建带有文件操作功能的窗口,并详细解释了文件对话框的使用方法,包括打开和保存文件的功能实现。此外,还探讨了Qt中的事件处理机制,如鼠标事件的响应和自定义事件处理。

1、文件对话框

first step:创建一个带有文本编辑功能的窗口

openAction= newQAction(QIcon(":/images/file-open"),tr("&Open..."),this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
 
saveAction= newQAction(QIcon(":/images/file-save"),tr("&Save..."),this);
saveAction->setShortcuts(QKeySequence::Save);
saveAction->setStatusTip(tr("Save a new file"));
 
QMenu *file= menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
file->addAction(saveAction);
 
QToolBar *toolBar= addToolBar(tr("&File"));
toolBar->addAction(openAction);
toolBar->addAction(saveAction);
 
textEdit= newQTextEdit(this);
setCentralWidget(textEdit);

second step:菜单和工具栏添加了两个动作:打开和保存

connect(openAction,&QAction::triggered,this,&MainWindow::openFile);
connect(saveAction,&QAction::triggered,this,&MainWindow::saveFile);

last step:openFile()saveFile()这两个函数的实现

voidMainWindow::openFile()
{
    QStringpath =QFileDialog::getOpenFileName(this,
                                                tr("Open File"),
                                                ".",
                                                tr("Text Files(*.txt)"));
    if(!path.isEmpty()){
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly| QIODevice::Text)){
            QMessageBox::warning(this,tr("Read File"),
                                tr("Cannot open file:\n%1").arg(path));
            return;
        }
        QTextStream in(&file);
        textEdit->setText(in.readAll());
        file.close();
    }else {
        QMessageBox::warning(this,tr("Path"),
                            tr("You did not select any file."));
    }
}
 
voidMainWindow::saveFile()
{
    QStringpath =QFileDialog::getSaveFileName(this,
                                                tr("Open File"),
                                                ".",
                                                tr("Text Files(*.txt)"));
    if(!path.isEmpty()){
        QFile file(path);
        if(!file.open(QIODevice::WriteOnly| QIODevice::Text)){
            QMessageBox::warning(this,tr("Write File"),
                                      tr("Cannot open file:\n%1").arg(path));
            return;
        }
        QTextStream out(&file);
        out<< textEdit->toPlainText();
        file.close();
    }else {
        QMessageBox::warning(this,tr("Path"),
                            tr("You did not select any file."));
    }
}


2、事件

class EventLabel : public QLabel
{
protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
};
 
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
    this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
                  .arg(QString::number(event->x()), QString::number(event->y())));
}
 
void EventLabel::mousePressEvent(QMouseEvent *event)
{
    this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
                  .arg(QString::number(event->x()), QString::number(event->y())));
}
 
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
    QString msg;
    msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                event->x(), event->y());
    this->setText(msg);
}
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    EventLabel *label = new EventLabel;
    label->setWindowTitle("MouseEvent Demo");
    label->resize(300, 200);
    label->show();
 
    return a.exec();
}
运行上面的代码,当我们点击了一下鼠标之后,label 上将显示鼠标当前坐标值。


3、事件的接受与忽略

示例代码:

// ---------- custombutton.h ---------- //
class CustomButton : public QPushButton
{
    Q_OBJECT
public:
    CustomButton(QWidget *parent = 0);
private:
    void onButtonCliecked();
};
 
// ---------- custombutton.cpp ---------- //
CustomButton::CustomButton(QWidget *parent) :
    QPushButton(parent)
{
    connect(this, &CustomButton::clicked,
            this, &CustomButton::onButtonCliecked);
}
 
void CustomButton::onButtonCliecked()
{
    qDebug() << "You clicked this!";
}
 
// ---------- main.cpp ---------- //
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    CustomButton btn;
    btn.setText("This is a Button!");
    btn.show();
 
    return a.exec();
}
点击按钮,会在控制台打印出“You clicked this!”字符串,下面,我们向CustomButton类添加一个事件函数:

// CustomButton
...
protected:
    void mousePressEvent(QMouseEvent *event);
...
 
// ---------- custombutton.cpp ---------- //
...
void CustomButton::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        qDebug() << "left";
    } else {
        QPushButton::mousePressEvent(event);
    }
}
我们重写了CustomButtonmousePressEvent()函数,也就是鼠标按下。在这个函数中,我们判断如果鼠标按下的是左键,则打印出来“left”字符串,否则,调用父类的同名函数。编译运行这段代码,当我们点击按钮时,“You clicked this!”字符串不再出现,只有一个“left”。

再来看一个例子:


class CustomButton : public QPushButton
{
    Q_OBJECT
public:
    CustomButton(QWidget *parent) : QPushButton(parent)
    {
    }
protected:
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug() << "CustomButton";
    }
};
 
class CustomButtonEx : public CustomButton
{
    Q_OBJECT
public:
    CustomButtonEx(QWidget *parent) : CustomButton(parent)
    {
    }
protected:
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug() << "CustomButtonEx";
    }
};
 
class CustomWidget : public QWidget
{
    Q_OBJECT
public:
    CustomWidget(QWidget *parent) : QWidget(parent)
    {
    }
protected:
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug() << "CustomWidget";
    }
};
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0) : QMainWindow(parent)
    {
        CustomWidget *widget = new CustomWidget(this);
        CustomButton *cbex = new CustomButton(widget);
        cbex->setText(tr("CustomButton"));
        CustomButtonEx *cb = new CustomButtonEx(widget);
        cb->setText(tr("CustomButtonEx"));
        QVBoxLayout *widgetLayout = new QVBoxLayout(widget);
        widgetLayout->addWidget(cbex);
        widgetLayout->addWidget(cb);
        this->setCentralWidget(widget);
    }
protected:
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug() << "MainWindow";
    }
};

这段代码在一个MainWindow中添加了一个CustomWidget,里面有两个按钮对象:CustomButtonCustomButtonEx。每

一个类都重写了mousePressEvent()函数。运行程序点击 CustomButtonEx,结果是:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值