デザイナーと共通コントロールの使用
1.デザイナー
1.デザイナーの使用
2.コードによるuiファイルの操作
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->pushButton->setText("text");
connect(ui->pushButton,&QPushButton,this,&MainWindow);
}
MainWindow::~MainWindow()
{
delete ui;
}
- デザイナのすべての機能は
ui->setupUi(this);
クレジットとして理解できるため、コードのUIインターフェイスを変更する場合は、このコードに従うのが最善です。 - uiインターフェースでコントロールを操作する方法は、uiインターフェースのコントロールを表すためにui->接頭辞が追加されることを除いて、通常のコントロールを操作するコードと同じです。
第二に、デザイナーで一般的に使用されるコントロール
1.Layouts:代表界面布局
2.スペーサー:代表间距等
3.ボタン:按钮类
4.アイテムビュー:数据库相关
5.アイテムウィジェット:文件目录树相关
6.コンテナ:容器
7.入力ウィジェット:输出控件
8.ウィジェットを表示する:显示控件
9. QLabelコントロール
QLabel 是我们最常用的控件之一, 其功能很强大, 我们可以用来显示文本, 图片和动画等
- 表示テキスト(通常のテキスト、html)は
、QLabelクラスのsetText関数によって設定されます。
voidsetText(const QString &)
- 通常のテキスト文字列を表示できます
QLable *label = new QLable;
label->setText(“Hello, World!”);
リンクの表示など、HTML形式で文字列を表示できます。
QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("<h1><a href=\"https://www.baidu.com\">
百度一下</a></h1>");
label ->setOpenExternalLinks(true);
どのsetOpenExternalLinks()ユーザーがリンクをクリックした後に機能が自動的に開くかどうかを設定するために使用され
たリンクを、パラメータがfalseにあれば、それが自動的に開きます真セット、開きたいリンクとして指定されている場合
のみlinkActivatedをする(取り込むことにより)信号、在 自 定 义 的 槽 函 数 中 使 用QDesktopServices::openUrl()打开链接, 该函数参数默认值为 false
QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("<h1><a href=\"https://www.baidu.com\">
百度一下</a></h1>");
// label->setOpenExternalLinks(true);
connect(label, &QLabel::linkActivated,
this, &MyWidget::slotOpenUrl);
//槽函数
void MyWidget::slotOpenUrl(const QString &link)
{
QDesktopServices::openUrl(QUrl(link));
}
- 画像の表示
QLabelのメンバー関数setPixmapを使用して画像を設定できます。
void setPixmap(const QPixmap &)
最初にQPixmapオブジェクトを定義します
QPixmap pixmap;
次に画像をロードします
pixmap.load(":/Image/boat.jpg");
最後に、画像をQLabelに設定します
QLabel *label = new QLabel;
label.setPixmap(pixmap);
- アニメーションを表示
QLabelのメンバー関数setMovieを使用してアニメーションをロードし、gif形式のファイルを再生できます
void setMovie(QMovie * movie)
最初にQMoviedオブジェクトを定義して初期化します。
QMovie *movie = new QMovie(":/Mario.gif");
ロードされたアニメーションを再生します。
movie->start();
アニメーションをQLabelに設定します。
QLabel *label = new QLabel;
label->setMovie(movie);
10.QLineEditコントロール
Qtが提供する単一行のテキスト編集ボックス。
- コンテンツの設定/取得
エディットボックスの内容を取得するには、テキスト()を使用します。関数宣言は次のとおりです。
QString text() const
編集ボックスの内容を設定する
void setText(const QString &)
- 表示モードを設定する
使用QLineEdit 类的 setEchoMode () 函数
テキスト表示モードの、関数の宣言:
void setEchoMode(EchoMode mode)
EchoModeは列挙型であり、4つの表示モードを定義します。
QLineEdit ::入力内容に応じた通常モードの表示モード。
QLineEdit :: NoEchoはコンテンツを表示しません。このモードでは、ユーザーの入力
QLineEdit ::パスワードパスワードモードを表示できません。入力した文字は、プラットフォームに応じて特殊文字に変換されます。
QLineEdit :: PasswordEchoOnEditは編集時に文字を表示し、そうでなければ文字をパスワードとして表示します
さらに、QLineEditを使用してテキストを表示する場合、左側に空白の領域を残しておくことを望み
ます。その場合、次の使用 QLineEdit 给我们提供的 setTextMargins
関数を使用できます。
void setTextMargins(int left, int top, int right, int bottom)
この関数を使用して、表示されたテキストと入力ボックスの上下左右の境界線の間のピクセル数を指定します。
- 入力プロンプトを設定する
Baiduの検索ボックスと同様の関数を実装する場合:1つまたは
いくつかの文字を入力すると、入力した文字と一致するいくつかの文字列が以下にリストされます。QLineEditは、
このようなメンバー関数を使用してそのような関数を実現できます達成するsetComleter()関数:
voidsetCompleter(QCompleter * c)
QCompleterオブジェクトを作成して初期化する
QStringList tipList;
tipList<< “Hello” << “how are you” << “Haha” << “oh, hello”;
// 不区分大小写
completer->setCaseSensitivity(Qt::CaseInsensitive);
QCompleter *completer = new QCompleter(tipList, this);
QCompleterクラスのsetCaseSensitivity()関数を使用して、大文字と小文字の区別を設定できます。そのパラメーターは列挙型です。
Qt :: CaseInsensitiveは大文字と小文字を区別しません
Qt :: CaseSensitiveは大文字と小文字を区別します
如果不设置该属性, 默认匹配字符串时是区分大小写的
。
さらに、文字列の特定の部分を照合するように設定することもできます。この
関数は、QCompleterクラスのsetFilterMode関数によって実装できます。関数宣言は次のとおりです。
voidsetFilterMode(Qt::MatchFlags filterMode)
パラメータはQtによって定義されたマクロであり、複数のタイプがあります。詳細については、Qtヘルプドキュメントを参照してください。上記
の関数を実装するには、パラメータを使用できますQt::MatchContains
。
completer->setFilterMode(Qt::MatchContains);
プロパティの設定が完了したら、QCompleterオブジェクトをQLineEditに設定します。
QLineEdit *edit = new QLineEdit(this);
edit->setCompleter(completer);
11.レイアウトマネージャー
最終的な分析では、いわゆるGUIインターフェースは、多数のコンポーネントを重ね合わせたものです。ウィンドウを作成し、その上にボタン
を配置し、その上にアイコンを配置して、インターフェイスにします。配置するときは、コンポーネントの位置が特に重要です。
- コンポーネントを配置する場所を指定して、必要な方法でウィンドウをレンダリングできるようにする必要があります。これには、コンポーネントの配置メカニズムが含まれます。
- Qtは部品を位置決めするための2つのメカニズムを提供します:
绝对定位和布局定位
。 - 絶対配置は、最も基本的な配置方法の1つです。このコンポーネントの座標と長さおよび幅の値を指定します。このようにして、Qtはコンポーネントを配置する場所と、コンポーネントのサイズを設定する方法を認識します。ただし、これによって引き起こされる問題は、最大化ボタンをクリックしたり、マウスでウィンドウの端をドラッグしたりするなど、ユーザーがウィンドウのサイズを変更した場合、絶対位置のコンポーネントが応答しないことです。コンポーネントがそれ自体を更新する必要があるかどうか、およびウィンドウが変更されたときにコンポーネントを更新する方法をQtに伝えなかったため、これも自然なことです。または、より簡単な方法があります。
禁止用户改变窗口大小。 但这总不是长远之计。
- レイアウトの配置:コンポーネントを特定のレイアウトに配置するだけでよく、レイアウトは特別なレイアウト
マネージャーによって管理されます。サイズまたは位置を調整する必要がある場合、Qtは対応するレイアウトマネージャーを使用して調整します。レイアウト配置は絶対配置を使用することの欠点を完全に解決します
Qtが提供する次の3つのレイアウトは、最もよく使用されるレイアウトです。
QHBoxLayout:水平方向の左から右へのレイアウト;
QVBoxLayout:垂直方向の上から下へのレイアウト;
QGridLayout:HTMLテーブルと同様のグリッド内のレイアウト;
1.水平/垂直/グリッドレイアウト
以下では、例を使用して、次の水平レイアウトマネージャーの使用方法を学習します。
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.setWindowTitle("Enter your age");
QSpinBox *spinBox = new QSpinBox(&window);
QSlider *slider = new QSlider(Qt::Horizontal, &window);
spinBox->setRange(0, 130);
slider->setRange(0, 130);
QObject::connect(slider, &QSlider::valueChanged,
spinBox, &QSpinBox::setValue);
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
QObject::connect(spinBox, spinBoxSignal,
slider, &QSlider::setValue);
spinBox->setValue(35);
//给控件设置布局
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window.setLayout(layout);
window.show();
return app.exec();
}
このコードでは、QSpinBoxとQSliderの2つの新しいコンポーネントを導入しました。QSpinBoxは、数値のみを入力できる入力ボックスで、上下の矢印が付いたステップボタンがあります。QSliderはスライダー付きのスライダーです
上記のコードwindow.setLayout(レイアウト);レイアウトウィンドウでウィンドウに提供され、別の方法でレイアウトウィンドウが提供されます。
//给控件设置布局
QHBoxLayout *layout = new QHBoxLayout(window) ;
layout->addWidget(spinBox);
layout->addWidget(slider);
レイアウトオブジェクトの作成時に新しいオブジェクトの親ウィンドウを指定することは、受信ウィンドウのレイアウトを設定することと同じです。さらに、レイアウトとレイアウトはネストできます。addLayout()メソッドを使用します。QVBoxLayoutはQHBoxLayoutとまったく同じ方法で使用されます
关于上述代码中信号和槽连接的解释
:
デジタル入力ボックスの内容が変更されると、メッセージが送信され、スライダーがこの信号を受信
して変更を行います。2つの信号スロット接続が次のように記述されている場合:
QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
编译器却会报错
no matching function for call to 'QObject::connect(QSpinBox*&,
<unresolved overloaded function type>, QSlider*&, void
(QAbstractSlider::*)(int))'
何が起こっているのですか?从出错信息可以看出, 编译器认为 QSpinBox::valueChanged 是一个 overloaded 的函数
。QSpinBoxのドキュメントを見ると、QSpinBoxには2つの信号があることがわかります。
void valueChanged(int)
void valueChanged(const QString&)
&QSpinBox :: valueChangedを使用して関数ポインターをフェッチする場合、コンパイラーはどの関数が関数を実行する必要があるかわかりません(前に紹介したように、信号も通常の関数です)。そのため、エラーが報告されます。解決策は簡単ですが、コンパイラはどの関数かわかりませんか?次に、明示的に関数を指定します。メソッドは、関数ポインターを作成し、この関数ポインターパラメーターをintとして指定します。
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
次に、この関数ポインターを信号として使用し、QSlider関数に接続します。
QObject::connect(spinBox, spinBoxSignal,
slider, &QSlider::setValue);
これはコンパイルエラーを回避します
2.カスタムコントロール
Qtウィンドウインターフェースを構築すると、プロジェクト内の多くのウィンドウ、またはウィンドウ内のモジュールが
頻繁に再利用されます。一般に、この場合、このウィンドウまたはモジュールを取り出し、
将来の再利用のために独立したウィンドウクラスにします。Qtのuiファイルを使用してインターフェイスを構築する場合、ツールバーバーには標準のウィンドウコントロールしか表示されません。カスタムコントロールを使用する場合はどうでしょうか。
例:QWidgetからクラスSmallWidgetを派生させ、カスタムウィンドウを実装します。
// smallwidget.h
class SmallWidget : public QWidget
{
Q_OBJECT
public:
explicit SmallWidget(QWidget *parent = 0);
signals:
public slots:
private:
QSpinBox* spin;
QSlider* slider;
};
// smallwidget.cpp
SmallWidget::SmallWidget(QWidget *parent) : QWidget(parent)
{
spin = new QSpinBox(this);
slider = new QSlider(Qt::Horizontal, this);
// 创建布局对象
QHBoxLayout* layout = new QHBoxLayout;
// 将控件添加到布局中
layout->addWidget(spin);
layout->addWidget(slider);
// 将布局设置到窗口中
setLayout(layout);
// 添加消息响应
connect(spin,static_cast<void (QSpinBox::*)(int)>
(&QSpinBox::valueChanged),slider,
&QSlider::setValue);
connect(slider, &QSlider::valueChanged,spin, &QSpinBox::setValue);
}
次に、このSmallWidgetを独立したウィンドウとして表示したり、コントロールとして使用したりできます