创建第一个项目—QQ聊天系统

源gitee项目

ltcctl/qq - 码云 - 开源中国 (gitee.com)

原b站视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//QQ界面头文件
#ifndef LOGIN_H
#define LOGIN_H
#include<QVector>
#include <QWidget>
#include<QMessageBox>
namespace Ui {
class Login;
}

class Login : public QWidget
{
Q_OBJECT

public:
explicit Login(QWidget *parent = 0);
~Login();

private:
Ui::Login *ui;
//初始状态为未打开登录后的界面
QVector<bool> isShow;
};

#endif // LOGIN_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//QQ界面源文件
#include "login.h"
#include "ui_login.h"
#include<QToolButton>
#include<QPixmap>
#include "widget.h"
Login::Login(QWidget *parent) :
QWidget(parent),
ui(new Ui::Login)
{
QVector<QToolButton*> vector;
ui->setupUi(this);
this->setWindowIcon(QIcon(":/images/qq.png"));
this->setWindowTitle("QQ");
//用户名列表
QStringList list;
list<<"性感小飞侠"<<"闷骚男"<<"韩国欧巴"<<"神经病一枚"<<"笨笨猪"<<"狗头"<<"蛇精病"<<"赵四"<<"本山兄弟";//联系人姓名
//图片资源列表
QStringList listIcon;
listIcon<<"spqy"<<"ymrl"<<"qq"<<"Cherry"<<"dr"<<"jj"<<"lswh"<<"qmnn"<<"spqy";

for(int i=0;i<9;i++){
QToolButton *btn=new QToolButton(this);//一次创建一个按钮
btn->setIcon(QPixmap(QString(":/images/%1.png").arg(listIcon[i])));//显示图片
btn>setIconSize(QPixmap(QString(":/images/%1.png").arg(listIcon[i])).size());//显示图片大小
//透明
btn->setAutoRaise(true);
//设置网名
btn->setText(QString("%1").arg(list[i]));
//设置显示格式
btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);//设置风格
ui->vlayout->addWidget(btn);//设置垂直布局,vlayout是自己命名的
vector.push_back(btn);
isShow.push_back(false);
}
for(int i=0;i<9;i++){
connect(vector[i],&QToolButton::clicked,[=](){//connect实现点击聊天对象的头像框时产生聊天界面
if(true==isShow[i]){
QMessageBox::warning(this,"警告","改聊天框已被打开");//防止一次打开多个聊天框
return;
}
isShow[i]=true;
Widget *widget=new Widget(0,vector[i]->text());
widget->setWindowIcon(vector[i]->icon());
widget->setWindowTitle(vector[i]->text());
widget->show();
//关闭聊天框时将对于的isShow跟改为false
connect(widget,&Widget::closeWidget,[=](){
isShow[i]=false;
});
});
}
}

Login::~Login()
{
delete ui;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//QQ聊天框界面头文件
#ifndef WIDGET_H
#define WIDGET_H
#include<QUdpSocket>
#include <QWidget>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
enum msgType{
Msg,//普通信息
UserEnter,//用户进入
UserLeft//用户离开
};
explicit Widget(QWidget *parent,QString name);
//重写关闭事件
void closeEvent(QCloseEvent *);
void sendMsg(msgType type);//广播信息
QString getName();//获取名字
QString getMsg();//获取聊天信息
void userEnter(QString username);//处理用户进入
void userLeft(QString username,QString time);//处理用户离开
void receiveMessage();//接收udp消息(槽函数)

~Widget();
signals:
//发送关闭信号
void closeWidget();
private:
Ui::Widget *ui;
QString myname;
quint16 port;//湍口
QUdpSocket *udpSocket;//udp套接字
};

#endif // WIDGET_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//QQ聊天框界面源文件
#include "widget.h"
#include "ui_widget.h"
#include<QDataStream>
#include<QMessageBox>
#include<QDateTime>
#include<QTableWidget>
#include<QComboBox>
#include<QFont>
#include<QColorDialog>
#include<QFileDialog>
#include<QDebug>
Widget::Widget(QWidget *parent,QString name) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->myname=name;
port=9999;
udpSocket=new QUdpSocket(this);
//允许其他服务器连接相同端口和地址|重新连接服务器
udpSocket->bind(port,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint);


//发送按钮
connect(ui->sendBtn,&QPushButton::clicked,this,[=](){
sendMsg(Msg);
});
//监听别人发送的数据
connect(udpSocket,&QUdpSocket::readyRead,this,&Widget::receiveMessage);

//新用户进入
sendMsg(UserEnter);
connect(ui->exitBtn,&QPushButton::clicked,this,[=](){
this->close();
});

//字体
connect(ui->fontCbx,&QFontComboBox::currentFontChanged,this,[=](const QFont &font){
//设置全局字体
ui->msgTxtEdit->setFontFamily(font.toString());
ui->msgTxtEdit->setFocus();
});

//字体大小
void (QComboBox:: *sizeBtn)(const QString &text)=&QComboBox::currentTextChanged;
connect(ui->sizeCbx,sizeBtn,this,[=](const QString &text){
ui->msgTxtEdit->setFontPointSize(text.toDouble());
ui->msgTxtEdit->setFocus();
});

//加粗
connect(ui->boldBtn,&QToolButton::clicked,this,[=](bool checked){
//是否按下
if(checked){
ui->msgTxtEdit->setFontWeight(QFont::Bold);
}else{
ui->msgTxtEdit->setFontWeight(QFont::Normal);
}
});

//倾斜
connect(ui->italicTbtn,&QToolButton::clicked,this,[=](bool checked){
ui->msgTxtEdit->setFontItalic(checked);
ui->msgTxtEdit->setFocus();
});

//下划线
connect(ui->underlineTbtn,&QToolButton::clicked,this,[=](bool checked){
ui->msgTxtEdit->setFontUnderline(checked);
ui->msgTxtEdit->setFocus();
});

//清空
connect(ui->clearTbtn,&QToolButton::clicked,this,[=](){
ui->msgBrowser->clear();
});

//字体颜色
connect(ui->colorTbtn,&QToolButton::clicked,this,[=](){
QColor color=QColorDialog::getColor(color,this);
ui->msgTxtEdit->setTextColor(color);
});

//保存聊天记录
connect(ui->saveTbtn,&QToolButton::clicked,this,[=](){
if(ui->msgBrowser->toPlainText().isEmpty()){
QMessageBox::warning(this,"警告","保存内容不能为空");
return;
}
//获取保存文件绝对路径/文件名(窗口标题,文件名,类型)
QString fileName=QFileDialog::getSaveFileName(this,"保存聊天记录","聊天记录","(*.txt)");
if(!fileName.isEmpty()){
QFile file(fileName);
file.open(QIODevice::WriteOnly|QFile::Text);
QTextStream stream(&file);
stream<<ui->msgBrowser->toPlainText();
file.close();
}
});
}

void Widget::closeEvent(QCloseEvent *)
{
emit closeWidget();
sendMsg(UserLeft);
udpSocket->close();
udpSocket->destroyed();
}

void Widget::sendMsg(Widget::msgType type)
{
QByteArray array;
QDataStream stream(&array,QIODevice::WriteOnly);
stream<<type<<this->getName();
switch (type)
{
case Msg:
if(ui->msgTxtEdit->toPlainText()=="")
{
QMessageBox::warning(this,"警告","发送的聊天内容不能为空!");
return;
}
stream<<this->getMsg();
break;
case UserEnter:
break;
case UserLeft:
break;
}
//书写报文
udpSocket->writeDatagram(array.data(),array.size(),QHostAddress::Broadcast,this->port);
}

QString Widget::getName()
{
return myname;
}

QString Widget::getMsg()
{
QString msg=ui->msgTxtEdit->toHtml();
ui->msgTxtEdit->clear();
ui->msgTxtEdit->setFocus();
return msg;
}

void Widget::userEnter(QString username)
{
bool IsEmpty=ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty();
if(IsEmpty)
{
QTableWidgetItem *table=new QTableWidgetItem(username);
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,table);
ui->msgBrowser->setTextColor(QColor(Qt::gray));
ui->msgBrowser->append(username+"已上线");
ui->userNumLbl->setText(QString("在线人数:%1").arg(ui->tableWidget->rowCount()));
sendMsg(UserEnter);
}
}

void Widget::userLeft(QString username, QString time)
{
bool isEmpty=ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty();
if(!isEmpty){
int row=ui->tableWidget->findItems(username,Qt::MatchExactly).first()->row();
ui->tableWidget->removeRow(row);
ui->msgBrowser->append(username+"用户于"+time+"离开");
ui->userNumLbl->setText(QString("在线人数:%1").arg(ui->tableWidget->rowCount()));
}
}

void Widget::receiveMessage()
{
qint64 size=udpSocket->pendingDatagramSize();
//int mysize= static_cast<int>(size);
QByteArray array=QByteArray(size,0);
udpSocket->readDatagram(array.data(),size);
QDataStream stream(&array,QIODevice::ReadOnly);
int mytype;
QString name,msg;//用户名 聊天内容
QString time=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
stream>>mytype;
switch (mytype) {
case Msg:
stream>>name>>msg;
ui->msgBrowser->setTextColor(QColor(Qt::blue));
ui->msgBrowser->append("["+name+"]"+time);
ui->msgBrowser->append(msg);
break;
case UserLeft:
stream>>name;
userLeft(name,time);
break;
case UserEnter:
stream>>name;
userEnter(name);
break;
}
}

Widget::~Widget()
{
delete ui;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//qq界面ui文件
/********************************************************************************
** Form generated from reading UI file 'login.ui'
**
** Created by: Qt User Interface Compiler version 5.9.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_LOGIN_H
#define UI_LOGIN_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QToolBox>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Login
{
public:
QGridLayout *gridLayout;
QToolBox *toolBox;
QWidget *page;
QVBoxLayout *vlayout;

void setupUi(QWidget *Login)
{
if (Login->objectName().isEmpty())
Login->setObjectName(QStringLiteral("Login"));
Login->resize(300, 700);
gridLayout = new QGridLayout(Login);
gridLayout->setObjectName(QStringLiteral("gridLayout"));
gridLayout->setContentsMargins(0, 0, 0, 0);
toolBox = new QToolBox(Login);
toolBox->setObjectName(QStringLiteral("toolBox"));
page = new QWidget();
page->setObjectName(QStringLiteral("page"));
page->setGeometry(QRect(0, 0, 300, 670));
vlayout = new QVBoxLayout(page);
vlayout->setObjectName(QStringLiteral("vlayout"));
toolBox->addItem(page, QString::fromUtf8("\347\276\244\346\210\220\345\221\230"));

gridLayout->addWidget(toolBox, 0, 0, 1, 1);


retranslateUi(Login);

toolBox->setCurrentIndex(0);


QMetaObject::connectSlotsByName(Login);
} // setupUi

void retranslateUi(QWidget *Login)
{
Login->setWindowTitle(QApplication::translate("Login", "Form", Q_NULLPTR));
toolBox->setItemText(toolBox->indexOf(page), QApplication::translate("Login", "\347\276\244\346\210\220\345\221\230", Q_NULLPTR));
} // retranslateUi

};

namespace Ui {
class Login: public Ui_Login {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_LOGIN_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
//qq聊天框界面ui文件
/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 5.9.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_WIDGET_H
#define UI_WIDGET_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QFontComboBox>
#include <QtWidgets/QFrame>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpacerItem>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QToolButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Widget
{
public:
QWidget *widget_2;
QWidget *widget;
QTextBrowser *msgBrowser;
QFrame *frame_2;
QGridLayout *gridLayout;
QToolButton *underlineTbtn;
QComboBox *sizeCbx;
QFontComboBox *fontCbx;
QToolButton *clearTbtn;
QToolButton *boldBtn;
QToolButton *colorTbtn;
QToolButton *saveTbtn;
QToolButton *italicTbtn;
QWidget *widget_3;
QGridLayout *gridLayout_2;
QTextEdit *msgTxtEdit;
QWidget *widget_4;
QGridLayout *gridLayout_3;
QSpacerItem *horizontalSpacer;
QPushButton *sendBtn;
QLabel *userNumLbl;
QPushButton *exitBtn;
QSpacerItem *horizontalSpacer_2;
QSpacerItem *horizontalSpacer_3;
QSpacerItem *horizontalSpacer_4;
QWidget *widget_5;
QGridLayout *gridLayout_4;
QTableWidget *tableWidget;

void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QStringLiteral("Widget"));
Widget->resize(891, 538);
widget_2 = new QWidget(Widget);
widget_2->setObjectName(QStringLiteral("widget_2"));
widget_2->setGeometry(QRect(0, 0, 601, 331));
widget = new QWidget(widget_2);
widget->setObjectName(QStringLiteral("widget"));
widget->setGeometry(QRect(11, 11, 591, 276));
msgBrowser = new QTextBrowser(widget);
msgBrowser->setObjectName(QStringLiteral("msgBrowser"));
msgBrowser->setGeometry(QRect(0, -9, 581, 281));
frame_2 = new QFrame(widget_2);
frame_2->setObjectName(QStringLiteral("frame_2"));
frame_2->setGeometry(QRect(11, 294, 581, 23));
frame_2->setFrameShape(QFrame::Box);
gridLayout = new QGridLayout(frame_2);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
gridLayout->setObjectName(QStringLiteral("gridLayout"));
gridLayout->setContentsMargins(0, 0, 0, 0);
underlineTbtn = new QToolButton(frame_2);
underlineTbtn->setObjectName(QStringLiteral("underlineTbtn"));
QIcon icon;
icon.addFile(QStringLiteral(":/images/under.png"), QSize(), QIcon::Normal, QIcon::Off);
underlineTbtn->setIcon(icon);
underlineTbtn->setCheckable(true);

gridLayout->addWidget(underlineTbtn, 0, 4, 1, 1);

sizeCbx = new QComboBox(frame_2);
sizeCbx->setObjectName(QStringLiteral("sizeCbx"));

gridLayout->addWidget(sizeCbx, 0, 1, 1, 1);

fontCbx = new QFontComboBox(frame_2);
fontCbx->setObjectName(QStringLiteral("fontCbx"));

gridLayout->addWidget(fontCbx, 0, 0, 1, 1);

clearTbtn = new QToolButton(frame_2);
clearTbtn->setObjectName(QStringLiteral("clearTbtn"));
QIcon icon1;
icon1.addFile(QStringLiteral(":/images/clear.png"), QSize(), QIcon::Normal, QIcon::Off);
clearTbtn->setIcon(icon1);

gridLayout->addWidget(clearTbtn, 0, 7, 1, 1);

boldBtn = new QToolButton(frame_2);
boldBtn->setObjectName(QStringLiteral("boldBtn"));
QIcon icon2;
icon2.addFile(QStringLiteral(":/images/bold.png"), QSize(), QIcon::Normal, QIcon::Off);
boldBtn->setIcon(icon2);
boldBtn->setCheckable(true);

gridLayout->addWidget(boldBtn, 0, 2, 1, 1);

colorTbtn = new QToolButton(frame_2);
colorTbtn->setObjectName(QStringLiteral("colorTbtn"));
QIcon icon3;
icon3.addFile(QStringLiteral(":/images/color.png"), QSize(), QIcon::Normal, QIcon::Off);
colorTbtn->setIcon(icon3);

gridLayout->addWidget(colorTbtn, 0, 5, 1, 1);

saveTbtn = new QToolButton(frame_2);
saveTbtn->setObjectName(QStringLiteral("saveTbtn"));
QIcon icon4;
icon4.addFile(QStringLiteral(":/images/save.png"), QSize(), QIcon::Normal, QIcon::Off);
saveTbtn->setIcon(icon4);

gridLayout->addWidget(saveTbtn, 0, 6, 1, 1);

italicTbtn = new QToolButton(frame_2);
italicTbtn->setObjectName(QStringLiteral("italicTbtn"));
QIcon icon5;
icon5.addFile(QStringLiteral(":/images/italic.png"), QSize(), QIcon::Normal, QIcon::Off);
italicTbtn->setIcon(icon5);
italicTbtn->setCheckable(true);

gridLayout->addWidget(italicTbtn, 0, 3, 1, 1);

widget->raise();
frame_2->raise();
widget->raise();
frame_2->raise();
widget_3 = new QWidget(Widget);
widget_3->setObjectName(QStringLiteral("widget_3"));
widget_3->setGeometry(QRect(10, 330, 581, 141));
gridLayout_2 = new QGridLayout(widget_3);
gridLayout_2->setSpacing(6);
gridLayout_2->setContentsMargins(11, 11, 11, 11);
gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
gridLayout_2->setContentsMargins(0, 0, 0, 0);
msgTxtEdit = new QTextEdit(widget_3);
msgTxtEdit->setObjectName(QStringLiteral("msgTxtEdit"));

gridLayout_2->addWidget(msgTxtEdit, 0, 0, 1, 1);

widget_4 = new QWidget(Widget);
widget_4->setObjectName(QStringLiteral("widget_4"));
widget_4->setGeometry(QRect(10, 480, 581, 50));
gridLayout_3 = new QGridLayout(widget_4);
gridLayout_3->setSpacing(6);
gridLayout_3->setContentsMargins(11, 11, 11, 11);
gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
gridLayout_3->setContentsMargins(0, 0, 0, 0);
horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

gridLayout_3->addItem(horizontalSpacer, 0, 0, 1, 1);

sendBtn = new QPushButton(widget_4);
sendBtn->setObjectName(QStringLiteral("sendBtn"));

gridLayout_3->addWidget(sendBtn, 0, 1, 1, 1);

userNumLbl = new QLabel(widget_4);
userNumLbl->setObjectName(QStringLiteral("userNumLbl"));

gridLayout_3->addWidget(userNumLbl, 0, 3, 1, 1);

exitBtn = new QPushButton(widget_4);
exitBtn->setObjectName(QStringLiteral("exitBtn"));

gridLayout_3->addWidget(exitBtn, 0, 5, 1, 1);

horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

gridLayout_3->addItem(horizontalSpacer_2, 0, 2, 1, 1);

horizontalSpacer_3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

gridLayout_3->addItem(horizontalSpacer_3, 0, 4, 1, 1);

horizontalSpacer_4 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

gridLayout_3->addItem(horizontalSpacer_4, 0, 6, 1, 1);

widget_5 = new QWidget(Widget);
widget_5->setObjectName(QStringLiteral("widget_5"));
widget_5->setGeometry(QRect(600, 10, 278, 521));
gridLayout_4 = new QGridLayout(widget_5);
gridLayout_4->setSpacing(6);
gridLayout_4->setContentsMargins(11, 11, 11, 11);
gridLayout_4->setObjectName(QStringLiteral("gridLayout_4"));
gridLayout_4->setContentsMargins(0, 0, 0, 0);
tableWidget = new QTableWidget(widget_5);
if (tableWidget->columnCount() < 1)
tableWidget->setColumnCount(1);
QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
tableWidget->setHorizontalHeaderItem(0, __qtablewidgetitem);
tableWidget->setObjectName(QStringLiteral("tableWidget"));

gridLayout_4->addWidget(tableWidget, 0, 0, 1, 1);


retranslateUi(Widget);

QMetaObject::connectSlotsByName(Widget);
} // setupUi

void retranslateUi(QWidget *Widget)
{
Widget->setWindowTitle(QApplication::translate("Widget", "Widget", Q_NULLPTR));
#ifndef QT_NO_TOOLTIP
underlineTbtn->setToolTip(QApplication::translate("Widget", "\344\270\213\345\210\222\347\272\277", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
underlineTbtn->setText(QApplication::translate("Widget", "...", Q_NULLPTR));
sizeCbx->clear();
sizeCbx->insertItems(0, QStringList()
<< QApplication::translate("Widget", "5", Q_NULLPTR)
<< QApplication::translate("Widget", "6", Q_NULLPTR)
<< QApplication::translate("Widget", "7", Q_NULLPTR)
<< QApplication::translate("Widget", "8", Q_NULLPTR)
<< QApplication::translate("Widget", "9", Q_NULLPTR)
<< QApplication::translate("Widget", "10", Q_NULLPTR)
<< QApplication::translate("Widget", "11", Q_NULLPTR)
<< QApplication::translate("Widget", "12", Q_NULLPTR)
);
#ifndef QT_NO_TOOLTIP
clearTbtn->setToolTip(QApplication::translate("Widget", "\346\270\205\347\251\272", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
clearTbtn->setText(QApplication::translate("Widget", "...", Q_NULLPTR));
#ifndef QT_NO_TOOLTIP
boldBtn->setToolTip(QApplication::translate("Widget", "\345\212\240\347\262\227", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
boldBtn->setText(QApplication::translate("Widget", "...", Q_NULLPTR));
#ifndef QT_NO_TOOLTIP
colorTbtn->setToolTip(QApplication::translate("Widget", "\351\242\234\350\211\262", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
colorTbtn->setText(QApplication::translate("Widget", "...", Q_NULLPTR));
#ifndef QT_NO_TOOLTIP
saveTbtn->setToolTip(QApplication::translate("Widget", "\344\277\235\345\255\230", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
saveTbtn->setText(QApplication::translate("Widget", "...", Q_NULLPTR));
#ifndef QT_NO_TOOLTIP
italicTbtn->setToolTip(QApplication::translate("Widget", "\345\200\276\346\226\234", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
italicTbtn->setText(QApplication::translate("Widget", "...", Q_NULLPTR));
sendBtn->setText(QApplication::translate("Widget", "\345\217\221\351\200\201", Q_NULLPTR));
userNumLbl->setText(QApplication::translate("Widget", "\345\234\250\347\272\277\344\272\272\346\225\260:0\344\272\272", Q_NULLPTR));
exitBtn->setText(QApplication::translate("Widget", "\351\200\200\345\207\272", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem = tableWidget->horizontalHeaderItem(0);
___qtablewidgetitem->setText(QApplication::translate("Widget", "\347\224\250\346\210\267\345\220\215:", Q_NULLPTR));
} // retranslateUi

};

namespace Ui {
class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_WIDGET_H

Qt:手动编辑UI文件——This file can only be edited in Design mode - ShineLe - 博客园

Excerpt

UI文件是只读文件,正常情况下我们只能在"Design"模式下,通过调整各种控件的方式间接修改它。 但是有时我们遇到许多重复性的工作,比如向某个Combobox中添加一系列的Item时,再用编辑UI的方式手动添加就显得比较麻烦,此时用编辑代码的方式反而会方便不少。 但是当我们尝试


UI文件是只读文件,正常情况下我们只能在"Design"模式下,通过调整各种控件的方式间接修改它。

但是有时我们遇到许多重复性的工作,比如向某个Combobox中添加一系列的Item时,再用编辑UI的方式手动添加就显得比较麻烦,此时用编辑代码的方式反而会方便不少。

但是当我们尝试在UI文件中编辑时,会出现“This file can only be edited in Design mode”的提示,而且我们对UI文件也无法进行任何代码写入修改。

如何解决?

我没有找到在Qt Creator中直接修改UI文件代码的方式,所以我选择在外部文本编辑器中修改UI文件。

先修改了UI文件的属性,取消“只读”,再在任意一个文本编辑器(TXT、Notepad等)中修改UI文件,最后保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
widget ui不能直接在qt中修改,文件建议打开记事本修改
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>891</width>
<height>538</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<widget class="QWidget" name="widget_2" native="true">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>601</width>
<height>331</height>
</rect>
</property>
<widget class="QWidget" name="widget" native="true">
<property name="geometry">
<rect>
<x>11</x>
<y>11</y>
<width>591</width>
<height>276</height>
</rect>
</property>
<widget class="QTextBrowser" name="msgBrowser">
<property name="geometry">
<rect>
<x>0</x>
<y>-9</y>
<width>581</width>
<height>281</height>
</rect>
</property>
</widget>
</widget>
<widget class="QFrame" name="frame_2">
<property name="geometry">
<rect>
<x>11</x>
<y>294</y>
<width>581</width>
<height>23</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="4">
<widget class="QToolButton" name="underlineTbtn">
<property name="toolTip">
<string>下划线</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/under.png</normaloff>:/images/under.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="sizeCbx">
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>7</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>9</string>
</property>
</item>
<item>
<property name="text">
<string>10</string>
</property>
</item>
<item>
<property name="text">
<string>11</string>
</property>
</item>
<item>
<property name="text">
<string>12</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QFontComboBox" name="fontCbx"/>
</item>
<item row="0" column="7">
<widget class="QToolButton" name="clearTbtn">
<property name="toolTip">
<string>清空</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/clear.png</normaloff>:/images/clear.png</iconset>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QToolButton" name="boldBtn">
<property name="toolTip">
<string>加粗</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/bold.png</normaloff>:/images/bold.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QToolButton" name="colorTbtn">
<property name="toolTip">
<string>颜色</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/color.png</normaloff>:/images/color.png</iconset>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QToolButton" name="saveTbtn">
<property name="toolTip">
<string>保存</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/save.png</normaloff>:/images/save.png</iconset>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QToolButton" name="italicTbtn">
<property name="toolTip">
<string>倾斜</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/italic.png</normaloff>:/images/italic.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<zorder>widget</zorder>
<zorder>frame_2</zorder>
<zorder>widget</zorder>
<zorder>frame_2</zorder>
</widget>
<widget class="QWidget" name="widget_3" native="true">
<property name="geometry">
<rect>
<x>10</x>
<y>330</y>
<width>581</width>
<height>141</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QTextEdit" name="msgTxtEdit"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="widget_4" native="true">
<property name="geometry">
<rect>
<x>10</x>
<y>480</y>
<width>581</width>
<height>50</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="sendBtn">
<property name="text">
<string>发送</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="userNumLbl">
<property name="text">
<string>在线人数:0人</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QPushButton" name="exitBtn">
<property name="text">
<string>退出</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="4">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="6">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="widget_5" native="true">
<property name="geometry">
<rect>
<x>600</x>
<y>10</y>
<width>278</width>
<height>521</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QTableWidget" name="tableWidget">
<column>
<property name="text">
<string>用户名:</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="res.qrc"/>
</resources>
<connections/>
</ui>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
qq登录界面ui文件
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Login</class>
<widget class="QWidget" name="Login">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>300</width>
<height>700</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QToolBox" name="toolBox">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>300</width>
<height>670</height>
</rect>
</property>
<attribute name="label">
<string>群成员</string>
</attribute>
<layout class="QVBoxLayout" name="vlayout"/>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

main文件

1
2
3
4
5
6
7
8
9
10
11
12
#include "widget.h"
#include <QApplication>
#include "login.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Widget w;
// w.show();
Login login;
login.show();
return a.exec();
}

第二个项目–腾讯云会议

第三个项目–仿暴风影音播放器