50、Qt 常用小部件介绍

Qt 常用小部件介绍

1. 布局窗口与基本原理

在布局窗口的代码中, LayoutWindow.cpp 创建了两个用于布局小部件的盒子布局,即水平和垂直盒子布局。垂直布局包含两个标签,分别为“Top”和“Bottom”;水平布局包含一个显示为“Right”的标签和垂直布局。可以像示例中那样,在布局小部件中自由放置其他布局小部件。

尝试修改 LayoutWindow.cpp 中的代码,以更好地理解盒子布局的工作原理。至此,我们已经了解了使用 Qt 的基本原理,包括信号与槽、元对象编译器(moc)和布局,接下来将更深入地研究小部件。

2. QLineEdit 小部件

QLineEdit 是 Qt 的单行文本输入小部件,用于输入简短文本,如用户的名字。可以使用输入掩码限制文本输入,使其符合特定模板,也可以应用验证函数,确保用户输入正确的日期、电话号码等。QLineEdit 具有编辑功能,用户可以选择文本部分、进行剪切和粘贴、撤销和重做等操作,这些操作既可以通过用户界面完成,也可以使用 API 实现。

以下是 QLineEdit 的构造函数和常用方法:

#include <qlineedit.h> 
QLineEdit::QlineEdit (QWidget *parent, const char* name = 0 )
QLineEdit::QLineEdit (const QString &contents, QWidget *parent, const char *name = 0 ) 
QLineEdit::QLineEdit (const QString &contents, const QString &inputMask, QWidget *parent, const char *name = 0 ) 
void    setInputMask (const QString &inputMask)
void    insert (const QString &newText )
bool    isModified (void) 
void    setMaxLength (int length) 
void    setReadOnly (bool read)
void    setText (const QString &text) 
QString text (void) 
void    setEchoMode(EchoMode mode) 

在构造函数中,像通常一样使用 parent name 设置父小部件和小部件名称。一个有趣的属性是 EchoMode ,它决定了文本在小部件中的显示方式,有以下三种值:
- QLineEdit::Normal :显示输入的字符(默认)
- QLineEdit::Password :用星号代替字符显示
- QLineEdit::NoEcho :不显示任何内容

可以使用 setEchoMode 设置模式,例如:

lineEdit->setEchoMode(QLineEdit::Password);

Qt 3.2 引入的输入掩码(inputMask)根据掩码规则限制输入。输入掩码是由字符组成的字符串,每个字符对应一个接受特定字符范围的规则。如果熟悉正则表达式,输入掩码使用的原理与之类似。输入掩码字符有两种类型:一种表示必须存在某个字符,另一种表示如果存在字符,则将其限制在规则范围内。以下是一些输入掩码字符及其含义的示例:
| 字符 | 含义 |
| ---- | ---- |
| # | 允许但不要求有正负号 |
| > | 将后续输入转换为大写 |
| < | 将后续输入转换为小写 |
|! | 停止大小写转换 |
| \ | 转义字符,用于将特殊字符用作分隔符 |

以下是一些输入掩码和允许输入的示例:
| 掩码 | 允许输入 |
| ---- | ---- |
| “AAAAAA-999D” | 允许 “Athens-2004”,但不允许 “Sydney-2000” 或 “Atlanta-1996” |
| “AAAAnn-99-99;” | 允许 “March-03-12”,但不允许 “May-03-12” 或 “September-03-12” |
| “000.000.000.000” | 允许 IP 地址,如 “192.168.0.1” |

2.1 QLineEdit 示例

以下是一个使用 QLineEdit 的示例:

// LineEdit.h
#include <qmainwindow.h>
#include <qlineedit.h>
#include <qstring.h>
class LineEdit : public QMainWindow
{
    Q_OBJECT
public:
    LineEdit(QWidget *parent = 0, const char *name = 0);
    QLineEdit *password_entry;
private slots:
    void Clicked();
};

// LineEdit.cpp
#include “LineEdit.moc”
#include <qpushbutton.h>
#include <qapplication.h>
#include <qlabel.h>
#include <qlayout.h>
#include <iostream>

LineEdit::LineEdit(QWidget *parent, const char *name) : QMainWindow(parent, name)
{
    QWidget *widget = new QWidget(this);
    setCentralWidget(widget);
    QGridLayout *grid = new QGridLayout(widget,3,2,10, 10,”grid”);
    QLineEdit *username_entry = new QLineEdit( widget, “username_entry”);
    password_entry = new QLineEdit( widget, “password_entry”);
    password_entry->setEchoMode(QLineEdit::Password);
    grid->addWidget(new QLabel(“Username”, widget, “userlabel”), 0, 0, 0);
    grid->addWidget(new QLabel(“Password”, widget, “passwordlabel”), 1, 0, 0);
    grid->addWidget(username_entry, 0,1, 0);
    grid->addWidget(password_entry, 1,1, 0);
    QPushButton *button = new QPushButton (“Ok”, widget, “button”);
    grid->addWidget(button, 2,1,Qt::AlignRight);
    resize( 350, 200 );
    connect (button, SIGNAL(clicked()), this, SLOT(Clicked()));
}

void LineEdit::Clicked(void)
{
    std::cout << password_entry->text() << “\n”;
}

int main(int argc, char **argv)
{
    QApplication app(argc,argv);
    LineEdit *window = new LineEdit();
    app.setMainWidget(window);
    window->show();
    return app.exec();
}

运行此程序时,会看到一个包含用户名和密码输入框以及一个按钮的窗口。点击按钮时,会打印出密码输入框中的内容。

3. Qt 按钮小部件

按钮小部件在各种工具包中都很常见,其外观、用法和 API 差异不大。Qt 提供了标准的 PushButton、CheckBox 和 RadioButton 变体。

3.1 QButton:按钮基类

Qt 中的按钮小部件都继承自抽象的 QButton 类。该类具有查询和切换按钮开/关状态的方法,以及设置按钮文本或像素图的方法。通常不需要直接实例化 QButton 小部件。以下是其有用的成员函数:

#include <qbutton.h> 
virtual void QButton::setText ( const QString & )
virtual void QButton::setPixmap ( const QPixmap & )
bool QButton::isToggleButton () const
virtual void QButton::setDown ( bool )
bool QButton::isDown () const
bool QButton::isOn () const
enum QButton::ToggleState { Off, NoChange, On }
ToggleState QButton::state () const

isDown isOn 函数含义相同,如果按钮被按下或激活,它们都返回 TRUE。如果某个选项当前不可用,可以通过调用 QWidget::setEnable(FALSE) 禁用包括 QButton 在内的任何小部件。

3.2 QPushButton

QPushButton 是标准的通用按钮,包含文本(如 “OK” 或 “Cancel”)和/或像素图图标。与所有 QButton 一样,激活时会发出 clicked 信号,通常用于连接槽并执行某些操作。可以通过调用 setToggleButton 将 QPushButton 从无状态按钮切换为切换按钮(即可以打开或关闭)。

以下是 QPushButton 的构造函数和常用方法:

#include <qpushbutton.h>
QPushButton (QWidget *parent, const char *name = 0)
QPushButton (const QString &text, QWidget *parent, const char *name = 0)
QPushButton (const QIconSet &icon, const QString &text, QWidget *parent, const char * name = 0 )
void QPushButton::setToggleButton (bool);
3.3 QCheckBox

QCheckBox 是有状态的按钮,可以打开或关闭。其外观取决于当前的窗口样式(如 Motif、Windows 等),通常显示为带有右侧文本的勾选框。还可以将 QCheckBox 设置为第三种中间状态,表示 “无更改”,这在某些情况下很有用,例如无法读取 QCheckBox 所代表选项的状态,但仍希望用户能够选择保持不变或主动打开/关闭该选项。

以下是 QCheckBox 的构造函数和常用方法:

#include <qcheckbox.h>
QCheckBox (QWidget *parent, const char *name = 0 )
QCheckBox (const QString &text, QWidget *parent, const char *name = 0 )
bool QCheckBox::isChecked () 
void QCheckBox::setTristate ( bool y = TRUE )
bool QCheckBox::isTristate () 
3.4 QRadioButton

单选按钮是用于表示排他性选择的切换按钮,用户只能从一组选项中选择一个。QRadioButton 与 QCheckBox 本身区别不大,分组和排他性由 QButtonGroup 类处理,主要区别在于单选按钮显示为圆形按钮,而不是勾选框。

QButtonGroup 是一个小部件,通过提供便利方法使处理按钮组更加容易:

#include <qbuttongroup.h>
QButtonGroup (QWidget *parent = 0, const char * name = 0 )
QButtonGroup (const QString & title, QWidget * parent = 0, const char * name = 0 )
int   insert (QButton *button, int id = -1)
void  remove (QButton *button)
int   id (QButton *button) const
int   count () const
int   selectedId () const  

使用 QButtonGroup 非常简单,如果使用带标题的构造函数,还可以在按钮周围添加可选的框架。可以使用 insert 方法或指定 QButtonGroup 作为按钮的父小部件,将按钮添加到 QButtonGroup 中。可以在 insert 方法中指定一个 ID,以唯一标识组中的每个按钮,这在查询哪个按钮被选中时特别有用,因为 selectedId 会返回被选中按钮的 ID。

以下是 QRadioButton 的构造函数和常用方法:

#include <qradiobutton.h>
QRadioButton (QWidget *parent, const char *name = 0 )
QRadioButton (const QString &text, QWidget *parent, const char *name = 0 )
bool   QRadioButton::isChecked ()
3.5 QButtons 示例

以下是一个使用 Qt 按钮的示例:

// Buttons.h
#include <qmainwindow.h>
#include <qcheckbox.h>
#include <qbutton.h>
#include <qradiobutton.h>
class Buttons : public QMainWindow
{
    Q_OBJECT
public:
    Buttons(QWidget *parent = 0, const char *name = 0);
private:
    void PrintActive(QButton *button);
    QCheckBox *checkbox;
    QRadioButton *radiobutton1, *radiobutton2;
private slots:
    void Clicked();
};

// Buttons.cpp
#include “Buttons.moc”
#include <qbuttongroup.h>
#include <qpushbutton.h>
#include <qapplication.h>
#include <qlabel.h>
#include <qlayout.h>
#include <iostream>

Buttons::Buttons(QWidget *parent, const char *name) : QMainWindow(parent, name)
{
    QWidget *widget = new QWidget(this);
    setCentralWidget(widget);
    QVBoxLayout *vbox = new QVBoxLayout(widget,5, 10,”vbox”);
    checkbox = new QCheckBox(“CheckButton”, widget, “check”);
    vbox->addWidget(checkbox);
    QButtonGroup *buttongroup = new QButtonGroup(0);
    radiobutton1 = new QRadioButton(“RadioButton1”, widget, “radio1”);
    buttongroup->insert(radiobutton1);
    vbox->addWidget(radiobutton1);
    radiobutton2 = new QRadioButton(“RadioButton2”, widget, “radio2”);
    buttongroup->insert(radiobutton2);
    vbox->addWidget(radiobutton2);
    QPushButton *button = new QPushButton (“Ok”, widget, “button”);
    vbox->addWidget(button);
    resize( 350, 200 );
    connect (button, SIGNAL(clicked()), this, SLOT(Clicked()));
}

void Buttons::PrintActive(QButton *button)
{
    if (button->isOn())
        std::cout << button->name() << “ is checked\n”;
    else
        std::cout << button->name() << “ is not checked\n”;
}

void Buttons::Clicked(void)
{
    PrintActive(checkbox);
    PrintActive(radiobutton1);
    PrintActive(radiobutton2);
    std::cout << “\n”;
}

int main(int argc, char **argv)
{
    QApplication app(argc,argv);
    Buttons *window = new Buttons();
    app.setMainWidget(window);
    window->show();
    return app.exec();
}

这个简单的示例展示了如何查询各种 Qt 按钮小部件的状态。可以看到,这些小部件创建后,大部分操作方式相同。例如, PrintActive 函数展示了如何获取按钮的开/关状态,该函数适用于所有有状态的按钮类型,如复选框和单选按钮。主要区别在于创建按钮小部件的调用方式,而单选按钮由于其排他性,创建时需要更多的操作,需要创建一个 QButtonGroup 来确保组中只有一个单选按钮可以在任何时候处于活动状态。

4. QComboBox 小部件

单选按钮适用于让用户从少量选项(例如六个或更少)中进行选择。当选项数量超过六个时,为了使窗口保持合理大小,情况会变得难以处理。此时,使用带有下拉菜单的输入框(即组合框)是一个完美的解决方案。点击组合框时,会显示选项菜单,选项数量仅受搜索列表的实际可行性限制。

QComboBox 结合了 QLineEdit、QPushButton 和下拉菜单的功能,使用户能够从无限数量的选项中选择一个。QComboBox 可以是读写或只读的。如果是读写模式,用户可以输入与提供的选项不同的内容;否则,用户只能从下拉列表中选择。

创建 QComboBox 时,可以在构造函数中使用布尔值指定其为读写或只读模式:

QComboBox *combo = new QComboBox(TRUE, parent, “widgetname”);

传入 TRUE 将 QComboBox 设置为读写模式,其他参数是通常的父小部件指针和小部件名称。

可以单独或批量添加选项,可以使用 QString 或传统的 char* 格式。插入单个项目可以调用 insertItem

combo->insertItem(QString(“An Item”), 1); 

这需要一个 QString 对象和一个位置索引,这里值为 1 表示将该项目设置为列表中的第一个。如果要添加到列表末尾,只需传入任何负整数。

更常见的是一次添加多个项目,可以使用 QStrList 类,或者像下面这样使用 char* 数组:

char* weather[] = {“Thunder”, “Lightning”, “Rain”, 0};
combo->insertStrList(weather, 3);

同样,可以指定插入项目在列表中的索引。

如果 QComboBox 是读写模式,用户输入的值可以自动添加到选项列表中,这是一个节省时间的实用功能,避免用户多次输入相同的值。插入策略(InsertionPolicy)控制新条目在选项列表中的添加位置,可以从以下选项中选择:
| 选项 | 作用 |
| ---- | ---- |
| QComboBox::AtTop | 将新条目插入列表的第一个选项 |
| QComboBox::AtBottom | 将新条目插入列表的最后一个选项 |
| QComboBox::AtCurrent | 替换之前选择的选项 |
| QComboBox::BeforeCurrent | 在之前选择的选项之前插入条目 |
| QComboBox::AfterCurrent | 在之前选择的选项之后插入条目 |
| QComboBox::NoInsertion | 新条目不插入选项列表 |

可以调用 setInsertionPolicy 方法设置策略,例如:

combo->setInsertionPolicy(QComboBox::AtTop);

以下是 QComboBox 的构造函数和常用方法:

#include <qcombobox.h>
QComboBox (QWidget *parent = 0, const char *name = 0)
QComboBox (bool readwrite, QWidget *parent = 0, const char *name = 0)
int     count ()
void    insertStringList (const QStringList &list, int index = -1)
void    insertStrList (const QStrList &list, int index = -1)
void    insertStrList (const QStrList *list, int index = -1)
void    insertStrList (const char **strings, int numStrings = -1, int index = -1)
void    insertItem (const QString &t, int index = -1)
void    removeItem (int index)
virtual void setCurrentItem (int index)
QString currentText ()
virtual void setCurrentText (const QString &)
void    setEditable (bool)

count 函数返回列表中的选项数量。 QStringList QStrList 是 Qt 字符串集合类,可用于添加选项。可以使用 removeItem 删除选项,使用 currentText setCurrentText 获取和设置当前选项,使用 setEditable 切换可编辑状态。

QComboBox 每当选择新选项时会发出 textChanged(QString&) 信号,并将新选择的选项作为参数传递。

4.1 QComboBox 示例

以下是一个使用 QComboBox 的示例:

// ComboBox.h
#include <qmainwindow.h>
#include <qcombobox.h>
class ComboBox : public QMainWindow
{
    Q_OBJECT
public:
    ComboBox(QWidget *parent = 0, const char *name = 0);
private slots:
    void Changed(const QString& s);
};

// ComboBox.cpp
#include “ComboBox.moc”
#include <qlayout.h>
#include <iostream>

ComboBox::ComboBox(QWidget *parent, const char *name) : QMainWindow(parent, name)
{
    QWidget *widget = new QWidget(this);
    setCentralWidget(widget);
    QVBoxLayout *vbox = new QVBoxLayout(widget, 5, 10,”vbox”);
    QComboBox *editablecombo = new QComboBox(TRUE, widget, “editable”);
    vbox->addWidget(editablecombo);
    QComboBox *readonlycombo = new QComboBox(FALSE, widget, “readonly”);
    vbox->addWidget(readonlycombo);
    static const char* items[] = { “Macbeth”, “Twelfth Night”, “Othello”, 0 };
    editablecombo->insertStrList (items);
    readonlycombo->insertStrList (items);
    connect (editablecombo, SIGNAL(textChanged(const QString&)), this, SLOT(Changed(const QString&))); 
    resize( 350, 200 );
}

void ComboBox::Changed(const QString& s)
{
    std::cout << s << “\n”;
}

int main(int argc, char **argv)
{
    QApplication app(argc,argv);
    ComboBox *window = new ComboBox();
    app.setMainWidget(window);
    window->show();
    return app.exec();
}

运行此程序时,会看到两个 QComboBox 小部件,一个是读写的,另一个是只读的。每当从可编辑的 QComboBox 中选择新选项时,会在命令行中打印出新选择的选项。

5. QListView 小部件

Qt 中的列表和树由 QListView 小部件提供。QListView 可以显示普通列表和按行和列划分的分层数据,非常适合显示目录结构等内容,因为可以通过点击加减号框展开和收缩子元素,就像文件查看器一样。

与 GTK+ 的 ListView 小部件不同,QListView 同时处理数据和视图,虽然灵活性不是特别突出,但使用起来很方便。使用 QListView 可以选择行或单个单元格,进行数据的剪切和粘贴、按列排序,并且可以在单元格中显示 QCheckBox 小部件。内置了大量功能,作为程序员,只需要添加数据并设置一些格式规则即可。

创建 QListView 与通常的方式相同,指定父小部件和小部件名称:

QListView *view = new QListView(parent, “name”);

设置列标题可以使用 addColumn 方法:

view->addColumn(“Left Column”, width1 ); // 固定宽度
view->addColumn(“Right Column”); // 宽度自动调整 

列的宽度以像素为单位设置,如果省略则默认为列中最宽元素的宽度,列会随着元素的添加和删除自动调整大小。

使用 QListViewItem 对象向 QListView 添加数据,该对象表示一行数据。只需要将 QListView 和行元素传递给构造函数,它就会自动添加到视图中:

QListViewItem *toplevel = new QListViewItem(view, “Left Data”, “Right Data”);

第一个参数可以是 QListView(如本例)或另一个 QListViewItem 。如果传递 QListViewItem ,该行将作为该 QListViewItem 的子项出现。因此,通过为顶级节点传递 QListView,为子节点传递后续的 QListViewItem 来形成树结构。

以下是 QListViewItem 的一些方法,可用于遍历树:

#include <qlistview.h> 
virtual void    insertItem ( QListViewItem * newChild )
virtual void    setText ( int column, const QString & text )
virtual QString text ( int column ) const
QListViewItem   *firstChild () const
QListViewItem   *nextSibling () const
QListViewItem   *parent () const
QListViewItem   *itemAbove ()
QListViewItem   *itemBelow ()

可以通过在 QListView 上调用 firstChild 获取树中的第一行,然后反复调用 firstChild nextSibling 来返回部分或整个树。

以下是一个打印所有顶级节点第一列的代码片段:

QListViewItem *child = view->firstChild();
while(child) 
{
    cout << myChild->text(1) << “\n”;
    myChild = myChild->nextSibling();
} 
5.1 QListView 示例

以下是一个使用 QListView 的示例:

// ListView.cpp
#include “ListView.moc”
ListView::ListView(QWidget *parent, const char *name) : QMainWindow(parent, name)
{
    listview = new QListView(this, “listview1”);
    listview->addColumn(“Artist”);
    listview->addColumn(“Title”);
    listview->addColumn(“Catalogue”);
    listview->setRootIsDecorated(TRUE);
    QListViewItem *toplevel = new QListViewItem(listview, “Avril Lavigne”, “Let Go”, “AVCD01”);
    new QListViewItem(toplevel, “Complicated”);
    new QListViewItem(toplevel, “Sk8er Boi”);
    setCentralWidget(listview);
}

int main(int argc, char **argv)
{
    QApplication app(argc,argv);
    ListView *window = new ListView();
    app.setMainWidget(window);
    window->show();
    return app.exec();
}

运行此程序时,会看到一个包含艺术家、标题和目录列的列表视图,其中包含一些示例数据。

综上所述,我们介绍了 Qt 中的多种常用小部件,包括 QLineEdit、按钮小部件(QPushButton、QCheckBox、QRadioButton)、QComboBox 和 QListView。每个小部件都有其独特的功能和用途,通过示例代码展示了如何使用它们。希望这些内容能帮助你更好地使用 Qt 进行开发。

Qt 常用小部件介绍

6. 小部件使用总结与对比

在前面的内容中,我们详细介绍了 Qt 中的多种常用小部件,下面对这些小部件的使用场景和特点进行总结与对比。

小部件名称 使用场景 特点
QLineEdit 用于输入简短文本,如用户名、密码等 可设置输入掩码、验证函数,有编辑功能,可设置显示模式
QPushButton 执行某个操作,如确认、取消等 可切换为切换按钮,激活时发出 clicked 信号
QCheckBox 表示某个选项的开关状态,可设置中间状态 有开/关和中间状态,可查询状态
QRadioButton 从一组选项中选择一个 需要使用 QButtonGroup 确保排他性
QComboBox 从大量选项中选择一个,可设置读写或只读模式 可单独或批量添加选项,有插入策略
QListView 显示普通列表或分层数据,如目录结构 可选择行或单元格,进行数据操作和排序

通过这个表格,我们可以更清晰地了解每个小部件的适用场景和特点,在实际开发中可以根据需求选择合适的小部件。

7. 小部件使用流程总结

下面是使用这些小部件的一般流程,以 mermaid 格式的流程图展示:

graph LR
    A[创建窗口] --> B[创建布局]
    B --> C[创建小部件]
    C --> D[设置小部件属性]
    D --> E[将小部件添加到布局]
    E --> F[连接信号与槽]
    F --> G[显示窗口]

这个流程图展示了使用 Qt 小部件的基本步骤:
1. 创建窗口 :使用 QMainWindow 或其他窗口类创建主窗口。
2. 创建布局 :选择合适的布局管理器,如 QGridLayout QVBoxLayout 等。
3. 创建小部件 :根据需求创建相应的小部件,如 QLineEdit QPushButton 等。
4. 设置小部件属性 :设置小部件的各种属性,如文本、输入掩码、显示模式等。
5. 将小部件添加到布局 :将创建好的小部件添加到布局管理器中。
6. 连接信号与槽 :将小部件的信号与相应的槽函数连接起来,实现交互功能。
7. 显示窗口 :调用 show() 方法显示窗口。

8. 代码优化建议

在使用这些小部件的过程中,我们可以对代码进行一些优化,以提高代码的可读性和可维护性。以下是一些建议:
- 封装重复代码 :如果有一些代码在多个地方重复使用,可以将其封装成函数或类,减少代码冗余。例如,在多个按钮的点击事件处理中,如果有相同的逻辑,可以将其封装成一个函数。
- 合理命名 :为小部件和变量取有意义的名字,使代码更易理解。例如,使用 username_entry 表示用户名输入框,而不是使用无意义的变量名。
- 使用注释 :在关键代码处添加注释,解释代码的功能和用途,方便后续维护。例如,在设置输入掩码的代码处,注释说明该掩码的作用。

9. 实际应用案例

假设我们要开发一个简单的用户登录界面,使用前面介绍的小部件可以实现如下:

// LoginWindow.h
#include <qmainwindow.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qlabel.h>
#include <qlayout.h>

class LoginWindow : public QMainWindow
{
    Q_OBJECT
public:
    LoginWindow(QWidget *parent = 0, const char *name = 0);
private slots:
    void onLoginClicked();
private:
    QLineEdit *username_entry;
    QLineEdit *password_entry;
    QPushButton *login_button;
};

// LoginWindow.cpp
#include “LoginWindow.moc”
#include <iostream>

LoginWindow::LoginWindow(QWidget *parent, const char *name) : QMainWindow(parent, name)
{
    QWidget *widget = new QWidget(this);
    setCentralWidget(widget);

    QGridLayout *grid = new QGridLayout(widget, 3, 2, 10, 10, “grid”);

    username_entry = new QLineEdit(widget, “username_entry”);
    password_entry = new QLineEdit(widget, “password_entry”);
    password_entry->setEchoMode(QLineEdit::Password);

    grid->addWidget(new QLabel(“Username”, widget, “userlabel”), 0, 0, 0);
    grid->addWidget(new QLabel(“Password”, widget, “passwordlabel”), 1, 0, 0);
    grid->addWidget(username_entry, 0, 1, 0);
    grid->addWidget(password_entry, 1, 1, 0);

    login_button = new QPushButton(“Login”, widget, “login_button”);
    grid->addWidget(login_button, 2, 1, Qt::AlignRight);

    resize(350, 200);

    connect(login_button, SIGNAL(clicked()), this, SLOT(onLoginClicked()));
}

void LoginWindow::onLoginClicked()
{
    std::cout << “Username: ” << username_entry->text() << std::endl;
    std::cout << “Password: ” << password_entry->text() << std::endl;
    // 这里可以添加实际的登录验证逻辑
}

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    LoginWindow *window = new LoginWindow();
    app.setMainWidget(window);
    window->show();
    return app.exec();
}

这个示例展示了如何使用 QLineEdit QPushButton QLabel 小部件创建一个简单的用户登录界面,并处理登录按钮的点击事件。

10. 总结与展望

通过本文的介绍,我们深入了解了 Qt 中多种常用小部件的使用方法和特点。这些小部件为我们开发图形用户界面提供了丰富的选择,可以根据不同的需求灵活组合使用。

在未来的开发中,我们可以进一步探索 Qt 的其他功能,如自定义小部件、动画效果等,以创建更加丰富和交互性强的应用程序。同时,我们也可以结合其他技术,如数据库、网络编程等,开发出更具实用性的软件。

希望本文能够帮助你更好地掌握 Qt 小部件的使用,在实际开发中发挥更大的作用。

提供的引用内容未提及Qt Creator中小部件类的相关信息,不过可从一般性知识来介绍。 在Qt Creator中,小部件类是构建图形用户界面(GUI)的基础元素。Qt提供了丰富的小部件类,这些类都继承自`QWidget`基类。 ### 常用小部件类 - **`QLabel`**:用于显示文本或图像,是最简单的小部件之一。例如,可以使用它来显示提示信息。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel app = QApplication(sys.argv) window = QWidget() label = QLabel("Hello, World!", window) label.move(50, 50) window.show() sys.exit(app.exec_()) ``` - **`QPushButton`**:创建按钮,用户可以点击按钮来触发特定的操作。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton app = QApplication(sys.argv) window = QWidget() button = QPushButton("Click me", window) button.move(50, 50) window.show() sys.exit(app.exec_()) ``` - **`QLineEdit`**:允许用户输入单行文本,常用于需要用户输入信息的场景,如登录框的用户名输入。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit app = QApplication(sys.argv) window = QWidget() line_edit = QLineEdit(window) line_edit.move(50, 50) window.show() sys.exit(app.exec_()) ``` - **`QTextEdit`**:支持多行文本输入和显示,可用于编辑大段文本,如文本编辑器。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit app = QApplication(sys.argv) window = QWidget() text_edit = QTextEdit(window) text_edit.move(50, 50) window.show() sys.exit(app.exec_()) ``` - **`QComboBox`**:提供一个下拉列表,用户可以从列表中选择一个选项。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QComboBox app = QApplication(sys.argv) window = QWidget() combo_box = QComboBox(window) combo_box.addItem("Option 1") combo_box.addItem("Option 2") combo_box.move(50, 50) window.show() sys.exit(app.exec_()) ``` ### 小部件类的使用方式 在Qt Creator中,可以通过两种主要方式使用小部件类: - **可视化设计**:使用Qt Designer,通过拖放操作将小部件添加到界面上,并设置其属性。 - **代码编程**:在代码中创建小部件对象,设置属性和信号槽连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值