Qt是一个C++应用程序框架。它拥有完备的C++图形库和集成了一系列代码模块, 支持C++,Python,QML,Javascript等多种语言,同时也拥有一套完整的设计、开发工具。
使用Qt开发的软件,相同的代码可以在大多数的平台上编译运行,而不需要修改源代码。 它会自动根据平台的不同,表现平台特有的图形界面风格。
QDialogs可以是模态对话框,也可以是非模态对话框,且可以提供返回值。
模态对话框
模态对话框(又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应,如单击【确定】或【取消】按钮等先将该对话框关闭。
模态对话框垄断了用户的输入。当一个模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象收不到输入信息。模态对话框下,用户需要操作目标对话框就必须先操作模态对话框。
模态对话框的最常见方法是调用其exec()函数。
当用户关闭对话框时,exec()将提供有用的返回值。要关闭对话框并返回适当的值,您必须将一个默认按钮连接起来,
例如,将OK按钮连接到accept()槽函数,将Cancel按钮连接到reject()槽函数。或者,您可以使用或调用done()槽函数。
另一种方法是调用setModal(true)或setWindowModality(),然后调用show(),与exec()不同,show()立即将控制权返回给调用者。
调用setModal(true)对于进度对话框特别有用,在该对话框中,用户必须具有与对话框进行交互的能力,例如取消长时间运行的操作。
如果同时使用show()和setModal(true)来执行较长的操作,则必须在处理期间定期调用QCoreApplication :: processEvents(),以使用户能够与对话框进行交互。
非模态对话框
非模态对话框(又叫做无模式对话框),与模态对话框不同,当用户打开非模态对话框时,依然可以操作其他窗口。
例如在文字处理器中查找和替换对话框通常是无模态的,以允许用户与应用程序的主窗口和对话框进行交互。
无模式对话框通常使用show()显示,该对话框立即将控制权返回给调用者。如果在隐藏对话框后调用show()函数,该对话框将以其原始位置显示。
这是因为窗口管理器决定了程序员未明确放置的窗口的位置。要保留用户已移动的对话框的位置,请将其位置保存在closeEvent()处理程序中,然后将对话框移至该位置,然后再次显示它。
下面我们一次来介绍Qt中常用的对话框。
6.1.
QFileDialog
QFileDialog类使用户可以遍历文件系统以选择一个或多个文件或目录。
下面分别是Ubuntu和Windows下面的文件对话框的效果。
getExistingDirectory
返回用户选择的现有目录
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), QFileDialog::Options options = ShowDirsOnly)
getExistingDirectoryUrl
返回用户选择的现有目录URL
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QUrl &dir = QUrl(), QFileDialog::Options options = ShowDirsOnly, const QStringList &supportedSchemes = QStringList())
getOpenFileContent
返回用户选择的文件的内容
(const QString &nameFilter, const std::function<void (const QString &, const QByteArray &)> &fileOpenCompleted)
QString
getOpenFileName
返回用户选择的现有文件
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString
*
selectedFilter = nullptr, QFileDialog::Options options = Options())
QStringList
getOpenFileNames
返回用户选择的一个或多个现有文件
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString
*
selectedFilter = nullptr, QFileDialog::Options options = Options())
getOpenFileUrl
返回用户选择的现有文件URL
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString
*
selectedFilter = nullptr, QFileDialog::Options options = Options(), const QStringList &supportedSchemes = QStringList())
QList<QUrl>
getOpenFileUrls
返回用户选择的一个或多个现有文件URL
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString
*
selectedFilter = nullptr, QFileDialog::Options options = Options(), const QStringList &supportedSchemes = QStringList())
QString
getSaveFileName
返回用户选择的文件名,该文件不必存在
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString
*
selectedFilter = nullptr, QFileDialog::Options options = Options())
getSaveFileUrl
返回用户选择的文件URL,该文件不必存在
(QWidget
*
parent = nullptr, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString
*
selectedFilter = nullptr, QFileDialog::Options options = Options(), const QStringList &supportedSchemes = QStringList())
saveFileContent
它将fileContent保存到文件中
(const QByteArray &fileContent, const QString &fileNameHint = QString())
在例程中,我们分别实现了,打开单个文件,打开多个文件,打开文件夹,将文本保存为文件。
通过调用QFileDialog的静态函数显示文件对话框与用户进行交互,让用户可以直观的选择文件、文件夹。
embed_qt_develop_tutorial_code/Dialog/mainwindows.cpp
84
void MainWindow::on_btn_openFile_clicked()
QString curPath=QDir::currentPath();//获取应用程序的路径
QString dlgTitle="选择文件"; //对话框标题
QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
QString fileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
if (fileName.isEmpty())
return;
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
ui->statusBar->showMessage("打开文件失败");
return;
ui->statusBar->showMessage("打开文件:"+fileName);
QTextStream in(&file);
ui->textEdit->clear();
ui->textEdit->setPlainText(in.readAll());
file.close();
void MainWindow::on_btn_openFiles_clicked()
QString curPath=QDir::currentPath();//获取应用程序的路径
QString dlgTitle="选择多个文件"; //对话框标题
QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
QStringList filelist = QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
ui->textEdit->clear();
foreach(QString str,filelist)
ui->textEdit->append(str);
void MainWindow::on_btn_openDir_clicked()
QString curPath=QDir::currentPath();//获取应用程序的路径
QString dlgTitle="选择文件夹"; //对话框标题
QString dirname = QFileDialog::getExistingDirectory(this,dlgTitle,curPath);
if (dirname.isEmpty())
return;
QDir dir(dirname);
QList<QFileInfo> files=dir.entryInfoList();
ui->statusBar->showMessage("打开文件夹:"+dirname);
ui->textEdit->clear();
for(int i = 0;i<files.count(); i++)
ui->textEdit->append(files.at(i).filePath());
ui->textEdit->append(files.at(i).fileName());
void MainWindow::on_btn_save_clicked()
if(ui->textEdit->toPlainText().isEmpty())
ui->statusBar->showMessage("内容不能为空");
return;
QString curPath=QDir::currentPath();//获取应用程序的路径
QString filePath=curPath+"/"+QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss")+".txt";
qDebug()<<filePath;
QString dlgTitle="保存文件"; //对话框标题
QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
QString fileName = QFileDialog::getSaveFileName(this, dlgTitle, filePath,filter);
if (fileName.isEmpty())
return ;
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
ui->statusBar->showMessage("保存文件失败");
} else {
QTextStream stream(&file);
stream << ui->textEdit->toPlainText();
stream.flush();
file.close();
ui->statusBar->showMessage("保存文件:"+fileName);
QFileDialog的使用无外乎就是下面四个参数的设置:路径、对话框标题、文件过滤器、调用静态函数
路径是指,我们想要文件对话框打开时,默认选择的路径
标题指对用户的提示,比如本对话框的作用
文件过滤器,指显示对话框显示的时候,对当前默认路径目录下的文件进行过滤,比如只显示txt后缀的文本文件
最后就是调用静态函数显示对话框,获取相关文件路径等等
getFont
返回用户选择的字体
(bool *ok, const QFont &initial, QWidget *parent = nullptr, const QString &title = QString(), QFontDialog::FontDialogOptions options = FontDialogOptions())
QFont
getFont
返回用户选择的字体
(bool *ok, QWidget *parent = nullptr)
QFont initfont=qApp->font();
QString dlgTitle="选择字体"; //对话框标题
QFont font=QFontDialog::getFont(&choose,initfont,this,dlgTitle); //选择字体
if(choose)
qApp->setFont(font);
ui->statusBar->showMessage("设置字体:"+font.toString());
例程中通过QFontDialog的静态函数getFont(),获取当前用户的选择的字体,并设置为当前app的字体。
其中,choose用于判断用户是直接关闭对话框,还是选择字体后窗口自行关闭的行为,简单点说用户是点击了取消还是确定。
6.3. QColorDialog
颜色对话框的功能是允许用户选择颜色。
getColor
用户选择一种颜色并返回;如果用户取消则返回无效的颜色
(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())
setCustomColor
设置在自定义颜色索引到的QColor 颜色值
(int index, QColor color)
setStandardColor
设置标准色在指数到的QColor 颜色值
(int index, QColor color)
QColor
standardColor
返回给定索引处的标准颜色作为QColor值
(int index)
我们这里就仅仅使用getColor(),如果用户点击了确定,则会返回有效的颜色,我们将该颜色的设置成文本框中字体的颜色。
embed_qt_develop_tutorial_code/Dialog/mainwindows.cpp
9
void MainWindow::on_btn_color_clicked()
QColor color=QColorDialog::getColor(Qt::white,this,"选择颜色");
if(color.isValid())
qDebug()<<color;
ui->textEdit->setTextColor(color);
6.4. QMessageBox
QMessageBox类提供了一个模式对话框,用于通知用户或询问用户问题并接收答案。
消息框显示一个主要文本,以警告用户注意某种情况;一个信息性文本,用于进一步说明警报或询问用户问题;
以及可选的详细文本,以在用户请求时提供更多数据。消息框还可以显示一个图标和用于接受用户响应的标准按钮。
critical
打开一个关键消息框
(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton)
QMessageBox::StandardButton
information
打开一个通知消息框
(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton
QMessageBox::StandardButton
question
打开一个询问消息框
(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = StandardButtons(Yes | No), QMessageBox::StandardButton defaultButton = NoButton)
QMessageBox::StandardButton
warning
打开一个警告消息框
(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton)
QString dlgTitle="critical";
QString str="严重错误";
QMessageBox::critical(this, dlgTitle, str,QMessageBox::Ok);
QString dlgTitle="information";
QString str="提示消息";
QMessageBox::information(this, dlgTitle, str,QMessageBox::Yes);
QString dlgTitle="question";
QString str="询问消息";
int choose=QMessageBox::question(this, dlgTitle, str,QMessageBox::Yes,QMessageBox::No,QMessageBox::Cancel);
switch (choose) {
case QMessageBox::Yes:
ui->statusBar->showMessage("你选择了OK");
break;
case QMessageBox::No:
ui->statusBar->showMessage("你选择了NO");
break;
case QMessageBox::Cancel:
ui->statusBar->showMessage("你选择了Cancel");
break;
default:
ui->statusBar->showMessage("你关闭了对话框");
break;
QString dlgTitle="warning";
QString str="警告消息";
QMessageBox::warning(this, dlgTitle, str,QMessageBox::Ok);
QString dlgTitle="about";
QString str="关于";
QMessageBox::about(this, dlgTitle, str);
6
void MainWindow::on_btn_error_clicked()
QErrorMessage *errDlg = new QErrorMessage(this);
errDlg->setWindowTitle("QErrorMessage");
errDlg->showMessage("错误信息");
getDouble
从用户那里获取浮点数
(QWidget *parent, const QString &title, const QString &label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), double step = 1)
getInt
从用户那里获取整形
(QWidget *parent, const QString &title, const QString &label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
QString
getItem
从用户那里获取选项
(QWidget *parent, const QString &title, const QString &label, const QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone)
QString
getMultiLineText
从用户那里获取多行文本
(QWidget *parent, const QString &title, const QString &label, const QString &text = QString(), bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone)
QString
getText
从用户那里获取文本
(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone)
bool choose=false;
double input = QInputDialog::getDouble(this, dlgTitle,str,currValue,min,max,decimal, &choose);
if (choose)
ui->statusBar->showMessage(QString::number(input));
bool choose=false;
int input = QInputDialog::getInt(this, dlgTitle,str,currValue,min,max,step, &choose);
if (choose)
ui->statusBar->showMessage(QString::number(input));
items <<"0"<<"1"<<"2"<<"3"<<"4"<<"5";
int curIndex=0;//初始Item
bool editable=true; //ComboBox是否可编辑
bool choose=false;
QString input = QInputDialog::getItem(this, dlgTitle,str,items,curIndex,editable, &choose);
if (choose)
ui->statusBar->showMessage(input);
16
void MainWindow::on_btn_getMultiLineText_clicked()
QString dlgTitle="getItem";
QString str="Item输入框";
QStringList items;
items <<"0"<<"1"<<"2"<<"3"<<"4"<<"5";
QString defaultstr="输入文本";
const QString defaulttext="输入文本";
bool choose=false;
QString input = QInputDialog::getMultiLineText(this, dlgTitle,str,defaultstr, &choose);
if (choose)
ui->statusBar->showMessage(input);
bool choose=false;
QString input = QInputDialog::getText(this, dlgTitle,str, echoMode,defaultstr, &choose);
if (choose)
if(input.isEmpty())
return;
ui->statusBar->showMessage(input);
13
void MainWindow::on_btn_progress_clicked()
QProgressDialog *progressDlg=new QProgressDialog(this);
progressDlg->setWindowModality(Qt::WindowModal);
progressDlg->setMinimumDuration(5);
progressDlg->setWindowTitle(tr("QProgressDialog"));
progressDlg->setLabelText(tr("进度条"));
progressDlg->setCancelButtonText(tr("取消"));
progressDlg->setRange(0,100);
progressDlg->setValue(59);
6
void MainWindow::on_btn_print_clicked()
QPrintDialog *print = new QPrintDialog(this);
print->exec();
explicit MyFrame(QWidget *parent = 0);
~MyFrame();
void setText(QString title,QString message,QString accept,QString reject);
signals:
private:
QString message;
QString message_title;
QString accept_text;
QString reject_text;
bool accept_hover;
bool reject_hover;
protected:
void paintEvent(QPaintEvent *);
void mouseMoveEvent(QMouseEvent *event);
#ifdef QtUi
#include <QtUi>
class QTUISHARED_EXPORT QtMessage : public QDialog {
#else
class QtMessage : public QDialog {
#endif
Q_OBJECT
public:
explicit QtMessage(QWidget *parent = 0);
//QtMessage(QWidget *parent = 0,QString title=tr("提示"),QString msg=tr("未知错误"),QString accept=tr("确认"),QString reject=tr("取消"));
~QtMessage();
void setMessage(QString Message);
signals:
private slots:
void acceptOperate();
void rejectOperate();
private:
MyFrame* frame;
protected:
void mousePressEvent( QMouseEvent * event );
void mouseReleaseEvent( QMouseEvent *);
void mouseMoveEvent(QMouseEvent *event);
#endif // QTMESSAGE_H
14
void MainWindow::on_btn_logo_clicked()
QtMessage *msg=new QtMessage(this);
msg->setMessage(QString("自定义问对话框"));
if(msg->exec()==QDialog::Accepted)
qDebug()<<"你点击了确定按钮";
qDebug()<<"你点击了取消按钮";
delete msg;
https://github.com/Embedfire/ebf_linux_qt_demo
https://gitee.com/Embedfire/ebf_linux_qt_demo
文档所涉及的示例代码也提供下载,仓库地址在:
https://github.com/LubanCat/embed_qt_develop_tutorial_code
https://gitee.com/LubanCat/embed_qt_develop_tutorial_code
本章例程在 embed_qt_develop_tutorial_code/Dialog
例程展示Qt对话框的使用。
6.10.1. 编程思路
创建一个简单工程;
添加QPushButton;
分别在按键的槽函数中调用不同的对话框
6.10.2. 代码讲解
示例中QMessageBox大多数通过调用静态函数,显示对话框
QString dlgTitle="information";
QString str="提示消息";
QMessageBox::information(this, dlgTitle, str,QMessageBox::Yes);
除了调用静态函数,还可以使用下面的方式,调用exec模态显示对话框。
QMessageBox meg;
QString dlgTitle="information";
QString str="提示消息";
QMessageBox msg(QMessageBox::Information,dlgTitle, str,QMessageBox::Yes, NULL);
msg.exec();
# scp传输文件
# scp 文件名 服务器上的某个用户@服务器ip:/文件保存路径
scp filename [email protected]:server_file_path
# 从服务器拉取文件
# scp 服务器上的某个用户@服务器ip:/服务器文件存放路径 拉取文件保存路径
scp [email protected]:server_file_path local_path
编译好的程序在 embed_qt_develop_tutorial_code/app_bin 目录中,通过scp命令将编译好的程序拉到LubanCat。
scp [email protected]:/home/embed_qt_develop_tutorial_code/app_bin/Dialog /usr/local/qt-app/
在LubanCat运行程序,使用run_myapp.sh配置好环境,并执行 Dialog 。
sudo /usr/local/qt-app/run_myapp.sh /usr/local/qt-app/Dialog