说明
本文主要熟悉一下 信号/槽如何在QT设计师中使用。如何在vs2013中新建QT5.6工程,新手看的大神们直接跳过。
第一步
自动生成了如下的一些文件如图:
第一个为QT设计师可以打开的文件;
第二个其实.UI对应的代码
下面一个生成的.h 和.cpp文件 还有一个main.cpp文件。
接下来我们打开.UI那个文件 这个时候QT设计师就打开了如图:
通过QT设计师我们可以拖出来各种界面我们要拖一个添加通讯录的简单界面,下面介绍如何来拖这个界面。
首先拖一个ListWidget控件到主界面中。并给他绑定对象名“addressList”,就像MFC中给控件绑定一个变量名一样的。如何2个地方都可以改
然后拖一个垂直布局的控件,然后把2个pushbutto按钮拖到垂直布局控件中,拖完按钮后记得在下面添加一个填充的控件,相当一个弹簧一样的功能如图:
同样记得给按钮控件添加相应的对象变量。我添加的对象变量为“Add” “Delete” 。添加方法见上面的ListWidget控件的添加。修改控件上面的字符显示就不说了太简单了。
在添加2个label用于显示用户添加的信息。2个label 的对象变量为 “nameLabel” “emailLabel”。修改控件上面的字符显示
至此主界面上的控件都已经划完了,接下来我们画用户信息输入框的界面。当我们点击添加时弹出添加对话框。首先添加一个QTGUI类右击项目的菜单添加
添加一个”AddDialog” 类 继承自 “QDialog”;
打开我们添加的类生产的.ui那个文件进入QT设计师界面进行界面的编辑。怎么拖界面上面已经界面的差不多了。我只说一下我们添加2个label 、2个Line Edit 1个pushBuuto
就可以了,对象名称label就不用管了我们用不上,我们给LineEdit起2个名字,还有button如下:
Widget ObjectName Text
QLabel
“nameText” “Name:”
QLabel
“emailText” “Email:”
QLineEdit
“nameEdit” “”
QLineEdit
“emailEdit” “”
QPushButton
“okButton” “OK”
我拖好的界面如下:
添加信号与槽
为”添加”按钮增加信号与槽的联系。此时可以在UI设计师的编辑\信号槽模式下进行,具体方法是拖动OK按钮释放后选择对应的信号与槽。点击这个按钮如图
总共添加三个信号连接
第一个:添加按钮和 on_addButton_clicked();
第二个:删除按钮和 on_deleteButton_clicked();
第三个:ok按钮和accept();
鼠标点击添加按钮拖到空白地方,然后就会弹出操作界面。然后按照画红线的地方操作。
添加按钮:
删除按钮:
ok按钮:
添加好的信号连接如下:
到这里信号和槽添加完了,下一步是修改程序里的函数
函数修改
在addressbook.h中添加:
private slots:
void on_addButton_clicked();
void on_addressList_currentItemChanged();
void on_deleteButton_clicked();
在addressbook.cpp中添加:
void AddressBook::on_addButton_clicked()
{
AddDialog dialog(this);
if (dialog.exec()) { //等待用户的输入,为模态对话框,对话框以外的操作不响应
QString name = dialog.ui.nameEdit->text();
QString email = dialog.ui.emailEdit->text();
if (!name.isEmpty() && !email.isEmpty()) {//当2者输入都非空时
QListWidgetItem *item = new QListWidgetItem(name, ui.addressList);//用于在QListWidge中显示的条目
item->setData(Qt::UserRole, email);//UserRole指的是后面的数据类型是针对特定程序应用的
ui.addressList->setCurrentItem(item);//把item放入QListWidge中
}
}
}
void AddressBook::on_addressList_currentItemChanged()
{
QListWidgetItem *curItem = ui.addressList->currentItem();//获取当前item
if (curItem) {
ui.nameLabel->setText("Name: " + curItem->text());//curItem->text()指的是item最前面的那个标题
ui.emailLabel->setText("Email: " +
curItem->data(Qt::UserRole).toString());//item的内容,且转化成了String类型
}
else {
ui.nameLabel->setText("<No item selected>");
ui.emailLabel->clear();
}
}
void AddressBook::on_deleteButton_clicked()
{
QListWidgetItem *curItem = ui.addressList->currentItem();
if (curItem) {
int row = ui.addressList->row(curItem);//返回当前item所在的行数
ui.addressList->takeItem(row);//takeItem(row)表示移除掉当前row的item,并返回当前的item
delete curItem;
if (ui.addressList->count() > 0)//计算当前所有的item个数,包括隐含的item
ui.addressList->setCurrentRow(0);//显示第一个item
else
on_addressList_currentItemChanged();//其目的窗口是下面的edit内容不显示
}
}
在adddialog.h中改动如下:
public:
Ui::AddDialog ui;
到这里整个程序就可以运行了。
程序源代码下载:
http://download.csdn.net/my/uploads