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);
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();
}
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);
}
}
我们重写了
再来看一个例子:
CustomButton的mousePressEvent()函数,也就是鼠标按下。在这个函数中,我们判断如果鼠标按下的是左键,则打印出来“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,里面有两个按钮对象:CustomButton和CustomButtonEx。每一个类都重写了
mousePressEvent()函数。运行程序点击 CustomButtonEx,结果是:
本文介绍如何使用Qt创建带有文件操作功能的窗口,并详细解释了文件对话框的使用方法,包括打开和保存文件的功能实现。此外,还探讨了Qt中的事件处理机制,如鼠标事件的响应和自定义事件处理。
990

被折叠的 条评论
为什么被折叠?



