添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
安静的毛豆  ·  ctf中web如何post | ...·  1 月前    · 
沉稳的萝卜  ·  SPI_BaudRatePrescaler_ ...·  2 月前    · 
另类的木瓜  ·  在 React Native ...·  3 月前    · 
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