Qtアプリケーションの設計(2つ):ウィンドウとコンポーネント

1つ:コンポーネント基本クラス継承テーブル

2:QWidgetウィジェット

1.ウィンドウとサブコンポーネント

       ウィジェットはウィジェットと略されます。ウィジェットは、Qtでユーザーインターフェイスを確立するための主要な要素です。メインウィンドウと同様に、ダイアログボックス、ラベル、ボタン、テキスト入力ボックスなどはすべてウィジェットです。これらのコンポーネントは、ユーザー入力を受け入れ、データとステータス情報を表示し、画面に描画することができます。一部は、他のコンポーネントを保持するためのコンテナとしても使用できます。Qtでは、他のコンポーネントに埋め込まれていないコンポーネントはウィンドウと呼ばれます。通常、ウィンドウには、次のプログラムのウィジェットやラベルのように、境界線とタイトルバーがあります。QMainWindowと多数のQDialogサブクラスは、最も一般的なウィンドウタイプです。ウィンドウは親パーツのないパーツであるため、トップパーツとも呼ばれます。反対は、サブコンポーネントとも呼ばれる非ウィンドウコンポーネントです。Qtのほとんどのコンポーネントはサブコンポーネントとして使用され、次のプログラムのlabel2などの他のウィンドウに埋め込まれます。

(1)新しいオブジェクトを作成します。パラメータの親が0の場合、それはウィンドウであることを意味します

    // 新建QWidget类对象,默认parent参数是0,所以它是个窗口
    QWidget *widget = new QWidget();
    widget->setWindowTitle(QObject::tr("我是widget"));

    // 新建QLabel对象,默认parent参数是0,所以它是个窗口
    QLabel *label = new QLabel();
    label->setWindowTitle(QObject::tr("我是label"));
    label->setText(QObject::tr("label:我是个窗口"));

(2)新しいオブジェクトは、子コンポーネントとして表される親ウィンドウとしてパラメータparentを指定します

    QLabel *label2 = new QLabel(widget);
    label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件"));

(3)適用されたスペースを解放します。子コンポーネントlabel2として、親ウィジェットを解放するだけで済みます。

    delete label;
    delete widget;

2.ウィンドウタイプ

QWidget :: QWidget(QWidget * parent = Q_NULLPTR、Qt :: WindowFlags f = Qt :: WindowFlags())

QWidgetコンストラクターには2つのパラメーターがあります。最初のパラメーターparentは親ウィジェットを参照し、デフォルト値は0です。これは、親ウィンドウがないことを意味します。2番目のパラメーターfは、Qt :: WindowsFlagsタイプです。 Qt :: WindowType列挙型または組み合わせ。Qt :: WindowType列挙型は、ウィジェットのさまざまなウィンドウシステムプロパティを指定するために使用されます。たとえば、上記の表f = 0によると、ウィンドウタイプの値はQt :: Widgetです。

例えば:

QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint);

新しいウィジェットウィンドウを作成します。親が0の場合、それは独立したウィジェットですが、そのプロパティQt :: Dialogはそれをダイアログボックスに変換し、Qt :: FramelessWindowHintプロパティはフレームのないウィンドウを生成するために使用されます。

3.ウィンドウレイアウト

Qtヘルプインデックスウィンドウとダイアログウィジェットには、次の概略図があります。

ウィンドウレイアウト機能は2つのカテゴリに分けられます。1つはフレームを含み、もう1つはフレームを含みません。

フレームが含まれています:x()、y()、frameGeometry()、pos()、move()。

フレームなし:geometry()、width()、height()、rect()、size()。

例:

    QWidget widget;
    widget.resize(400, 300);       // 设置窗口大小
    widget.move(200, 100);         // 设置窗口位置
    widget.setWindowTitle("窗口布局");
    widget.show();
    int x = widget.x();
    qDebug("x: %d", x);            // 输出x的值
    int y = widget.y();
    qDebug("y: %d", y);
    QRect geometry = widget.geometry();
    QRect frame = widget.frameGeometry();
    qDebug() << "geometry: " << geometry << "frame: " << frame;

3:ダイアログボックスQDialog

1.モーダルおよび非モーダルダイアログボックス

       QDialogクラスは、すべてのダイアログウィンドウクラスの基本クラスです。ダイアログウィンドウはトップレベルのウィンドウであり、短いタスクを完了したり、単にユーザーとやり取りしたりするためによく使用されます。ダイアログボックスを実行するときにプログラムの他のウィンドウと対話できるかどうかに応じて、ダイアログボックスは多くの場合、モーダルと非モーダルの2つのカテゴリに分けられます。

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    if(1)
    {
        QDialog dialog(this);
        dialog.show();
    }
    else
    {
        QDialog *dialog = new QDialog(this);
        dialog->show();
    }
}

       if条件でプログラムを実行すると、ウィンドウが点滅し、最後にMyWidgetウィンドウのみが残ります。これは、ダイアログ変数がコンストラクターに属しているためです。関数を実行すると、ダイアログが解放されます。ウィンドウが通過しないようにするために、ポインター操作を使用して、else条件のコードなど、Qdialogクラスオブジェクトへのポインター変数を定義できます。また、親ウィンドウが指定されているため、ポインタオブジェクトを削除して解放する必要はありません。親ウィンドウが終了すると、ポインタ変数も解放されます。

       else条件のプログラムが実行されると、ウィジェットとダイアログウィンドウが同時に表示され、相互作用できるようになります。これは、非モーダルダイアログボックスと呼ばれます。

QDialog *dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();

        次のプログラムを変更してモーダルダイアログボックスにします。つまり、現在のダイアログボックスを閉じる前に他のダイアログボックスを操作することはできません。if条件でexec()関数を使用すると、モーダルダイアログボックスを実装することもできます。表示効果のみが異なり、現在のウィンドウを閉じている場合のみ、他のウィンドウが表示されます。

2.マルチウィンドウスイッチング

main.cpp:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    MyDialog dialog;                        // 新建MyDialog类对象
    if(dialog.exec()==QDialog::Accepted){   // 判断dialog执行结果
        w.show();              // 如果是按下了“进入主界面”按钮,则显示主界面
        return a.exec();                    // 程序正常运行
    }
    else return 0;                          // 否则,退出程序
}

dialog.cpp:
void MyDialog::on_pushButton_clicked()
{
    accept();
}

widget.cc:
void MyWidget::on_showChildButton_clicked()
{
    QDialog *dialog = new QDialog(this);
    dialog->show();
}

void MyWidget::on_pushButton_clicked()
{
    // 先关闭主界面,其实它是隐藏起来了,并没有真正退出。然后新建MyDialog对象
    close();
    MyDialog dlg;
    // 如果按下了“进入主窗口”按钮,则再次显示主界面
    // 否则,因为现在已经没有显示的界面了,所以程序将退出
    if(dlg.exec() == QDialog::Accepted) show();
}

上記のaccept()関数はQDialogクラスのスロットです。exec()関数を使用して実装されたモーダルダイアログの場合、このスロットの実行後にモーダルダイアログは非表示になり、QDialog :: Accepted値が返されます。この値を使用して、押されたボタンを判別します。

3.標準ダイアログ

(1)カラーダイアログ

// 颜色对话框
void MyWidget::on_pushButton_clicked()
{
    //QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"),
                                              QColorDialog::ShowAlphaChannel);

    QColorDialog dialog(Qt::red, this);                // 创建对象
    dialog.setOption(QColorDialog::ShowAlphaChannel); // 显示alpha选项
    dialog.exec();                                    // 以模态方式运行对话框
    QColor color = dialog.currentColor();             // 获取当前颜色
    qDebug() << "color: " << color;
}

(2)ファイルダイアログ

// 文件对话框
void MyWidget::on_pushButton_2_clicked()
{
    //    QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
    //                             "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));

    //    qDebug() << "fileName:" << fileName;

    QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"),
                                                          "D:", tr("图片文件(*png *jpg)"));
    qDebug()<< "fileNames:" << fileNames;
}

(3)フォントダイアログボックス

// 字体对话框
void MyWidget::on_pushButton_3_clicked()
{
    // ok用于标记是否按下了“OK”按钮
    bool ok;
    QFont font = QFontDialog::getFont(&ok, this);
    // 如果按下“OK”按钮,那么让“字体对话框”按钮使用新字体
    // 如果按下“Cancel”按钮,那么输出信息
    if (ok) ui->pushButton_3->setFont(font);
    else qDebug() << tr("没有选择字体!");
}

(4)入力ダイアログボックス

// 输入对话框
void MyWidget::on_pushButton_4_clicked()
{
    bool ok;
    // 获取字符串
    QString string = QInputDialog::getText(this, tr("输入字符串对话框"),
                                           tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
    if(ok) qDebug() << "string:" << string;
    // 获取整数
    int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),
                                      tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
    if(ok) qDebug() << "value1:" << value1;
    // 获取浮点数
    double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),
                                            tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
    if(ok) qDebug() << "value2:" << value2;
    QStringList items;
    items << tr("条目1") << tr("条目2");
    // 获取条目
    QString item = QInputDialog::getItem(this, tr("输入条目对话框"),
                                         tr("请选择或输入一个条目"), items, 0, true, &ok);
    if(ok) qDebug() << "item:" << item;
}

(5)メッセージダイアログ

// 消息对话框
void MyWidget::on_pushButton_5_clicked()
{
    // 问题对话框
    int ret1 = QMessageBox::question(this, tr("问题对话框"),
                                     tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
    if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
    // 提示对话框
    int ret2 = QMessageBox::information(this, tr("提示对话框"),
                                        tr("这是Qt书籍!"), QMessageBox::Ok);
    if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
    // 警告对话框
    int ret3 = QMessageBox::warning(this, tr("警告对话框"),
                                    tr("不能提前结束!"), QMessageBox::Abort);
    if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
    // 错误对话框
    int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),
                                     tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
    if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
    // 关于对话框
    QMessageBox::about(this, tr("关于对话框"),
                       tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
}

(6)進行状況ダイアログ

// 进度对话框
void MyWidget::on_pushButton_6_clicked()
{
    QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
    dialog.setWindowTitle(tr("进度对话框"));     // 设置窗口标题
    dialog.setWindowModality(Qt::WindowModal);  // 将对话框设置为模态
    dialog.show();
    for(int i=0; i<50000; i++) {                // 演示复制进度
        dialog.setValue(i);                     // 设置进度条的当前值
        QCoreApplication::processEvents();      // 避免界面冻结
        if(dialog.wasCanceled()) break;         // 按下取消按钮则中断
    }
    dialog.setValue(50000);    // 这样才能显示100%,因为for循环中少加了一个数
    qDebug() << tr("复制结束!");
}

(7)ウィザードダイアログボックス

private:
    Ui::MyWidget *ui;
    QErrorMessage *errordlg;

    QWizardPage *createPage1();        // 新添加
    QWizardPage *createPage2();        // 新添加
    QWizardPage *createPage3();        // 新添加
QWizardPage * MyWidget::createPage1()  // 向导页面1
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("介绍"));
    return page;
}
QWizardPage * MyWidget::createPage2()  // 向导页面2
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("用户选择信息"));
    return page;
}
QWizardPage * MyWidget::createPage3()  // 向导页面3
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("结束"));
    return page;
}

// 向导对话框
void MyWidget::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("向导对话框"));
    wizard.addPage(createPage1());     // 添加向导页面
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}

4:他のウィジェット

1.QFrameクラスファミリー

       QFrameクラスは、境界線のあるパーツの基本クラスです。境界線のあるパーツの主な機能は、明確なフレームを持つことができることです。QFrameクラスの主な機能は、主にフレーム形状(Shape)とフレームシャドウ(Shadow)の組み合わせによって形成されるさまざまなフレーム効果を実現することです。

    ui->frame->setFrameShape(QFrame::Box);
    ui->frame->setFrameShadow(QFrame::Sunken);
    // 以上两个函数可以使用setFrameStyle(QFrame::Box | QFrame::Sunken)代替
    ui->frame->setLineWidth(5);
    ui->frame->setMidLineWidth(10);

(1)QLabel

ラベルQLableウィジェットは、テキストと画像を表示するために使用されます

フォントを設定します。

    QFont font;
    font.setFamily("华文行楷");
    font.setPointSize(20);
    font.setBold(true);
    font.setItalic(true);
    ui->label->setFont(font);

    QString string = tr("标题太长,需要进行省略!");
    QString str = ui->label->fontMetrics().elidedText(string, Qt::ElideRight, 180);
    ui->label->setText(str);

画像を設定します。

#include <QPixmap>

ui->label->setPixmap(QPixmap("D:/WorkSpace/QtCreator/src/03/3-8/logo.png"));

アニメーションを設定します。

#include <QMovie>
  
QMovie *movie = new QMovie("D:/WorkSpace/QtCreator/src/03/3-8/donghua.gif");
ui->label->setMovie(movie);                  // 在标签中添加动画
movie->start();

(2)QLCDNumber

デジタル文字にLCD番号と同じ効果を表示させることができます。詳細については、ヘルプファイルを参照してください。

(3)QStackedWidget

このクラスは、複数のインターフェースを持つことができるコンポーネントスタックを提供します。各インターフェースは独自のコンポーネントを持つことができますが、一度に表示できるインターフェースは1つだけです。このウィジェットは、QComboBoxまたはQListWidgetを使用してさまざまなページを選択する必要があります。信号およびスロットデザインモードで2つのコンポーネントを関連付けます。

(4)QToolBox

このクラスは、一般的に使用されるチャットツールの引き出し効果と同じように、スタックされたウィジェットのリストを提供します。

2.ボタンパーツ

        QAbstractButtonクラスは、ボタンコンポーネントの抽象基本クラスであり、ボタンの一般的な機能を提供します。そのサブクラスには、チェックボックスQCheckBox、標準ボタンQPushButton、ラジオボタンQRadioButton、およびツールボタンQToolButtonが含まれます。

(1)QPushButton

ボタンボックスを使用して「選択」します。

void MyWidget::on_pushBtn1_toggled(bool checked)
{
    qDebug() << tr("按钮是否按下:") << checked;
}

ショートカットキーの使用法:Alt + N

ui->pushBtn1->setText(tr("&nihao"));   // 这样便指定了Alt+N为加速键

ボタンアイコンの設定:

ui->pushBtn2->setIcon(QIcon("../mybutton/images/help.png"));

ボタンのドロップダウンメニューを設定します。

    ui->pushBtn3->setText(tr("z&oom"));
    QMenu *menu = new QMenu(this);
    menu->addAction(QIcon("../mybutton/images/zoom-in.png"), tr("放大"));
    ui->pushBtn3->setMenu(menu);

 

 

つづく。

おすすめ

転載: blog.csdn.net/qq_34968572/article/details/105434150