创建用于将一些文本放入 QTextEdit 的插槽时出现问题
Problems creating a slot for putting some text into QTextEdit
我一直在努力解决插槽问题,因此我做了相当彻底的研究,但是随着 Google 搜索结果稳步变得越来越紫色,我决定只问问 SO 朋友 = ) 请注意,我没有使用 QtCreator,也没有使用任何动态的东西。我需要:
- 声明一些常量 QString
- 从 QLineEdits 中获取一些 QStrings
- 加 1 和 2
- 最后,单击按钮时将它们放入 QTextEdit。
对于第 1 步,我这样声明 QString:
QString set_1 = "ООО «Хеллманн» (129343, г. Москва, ул. Уржумская, д. 4, стр. 14, ИНН 7722637955, ОГРН 1087746168476) доверяет забор груза - ";
QString set_2 = " - перегружаемого из контейнера ";
QString set_3 = ", в количестве ";
QString set_4 = " паллет, весом ";
QString set_5 = " кг, водителю ";
QString set_6 = ", паспорт ";
QString set_7 = " выдан ";
QString set_8 = ".";
QString set_9 = " На автотранспортном средстве марки ";
QString set_10 = " - ";
QString set_11 = ", прицеп: ";
然后,对于第 2 步,我像这样从 QLineEdits 中创建 QStrings(例如 line_b_b 是 QLineEdit 的名称):
QString a = line_b_b.text();
QString b = line_b_a.text();
QString c = line_b_c.text();
QString d = line_b_d.text();
QString e = line_a_b.text();
QString f = line_a_a.text();
QString g = line_a_c.text();
QString h = line_a_d.text();
QString i = line_c_b.text();
QString j = line_c_a.text();
QString k = line_c_c.text();
对于第 3 步,我将第 1 步中的 QString 与第 2 步中的 QString 添加到名为 "doverka" 的变量中(请不要介意这些西里尔字符):
QString doverka = set_1+a+set_2+b+set_3+c+set_4+d+set_5+e+set_6+f+set_7+g+h+set_8+set_9+i+set_10+j+set_11+k+set_8;
最后,在第 4 步中,我尝试在按下按钮时将整体放入 QTextEdit。我想问题就在这里。我创建了一个名为 "text":
的 QTextEdit
QTextEdit text (&dw);
text.show();
然后我尝试创建一个插槽,我认为我这样做是完全错误的,因为它根本不起作用:
QPushButton btn_t ("Создать текст", &dw);
QObject::connect(
&btn_t,
SIGNAL(clicked()),
&text,
SLOT([dover](){return text.setText(doverka)}));
btn_t.show();
我是 Qt 和 C++ 的新手,这就是为什么插槽创建很差的原因。在这里,我尝试使用 lambda 函数进行此操作,但显然我做错了什么。也许我应该把 lambda 函数放在 SLOT
之前的其他地方?编译 prog 时我的插槽未被识别,我收到 "no such slot" 通知。或者问题可能出在更早的地方,例如从 QLineEdits 中制作 QStrings(第 2 步)?..我很无助,非常感谢任何有用的提示!非常感谢。
您正在尝试将旧式 Qt signal/slot 连接与显然不起作用的新式混合。 lambdas 只能用于新的连接方式。如果您使用的是 Qt 5,连接可能是这样的:
QObject::connect(
&btn_t,
&QPushButton::clicked,
[&text, &doverka](){
text.setText(doverka);
});
您应该注意 text
和 doverka
对象不应在调用 lambda 之前销毁,因为它们是通过引用捕获的。
如果使用 Qt 4.*,您应该使用旧语法。在您的情况下,只需在 class 中提供一个插槽并连接信号即可:
QObject::connect(
&btn_t,
SIGNAL(clicked()),
this,
SLOT(onClicked()));
您的 class 应继承自 QObject
并包含如下插槽:
public slots:
void onClicked() {
text.setText(doverka);
}
另请注意 text
和 doverka
应该是 class 的成员。
我一直在努力解决插槽问题,因此我做了相当彻底的研究,但是随着 Google 搜索结果稳步变得越来越紫色,我决定只问问 SO 朋友 = ) 请注意,我没有使用 QtCreator,也没有使用任何动态的东西。我需要:
- 声明一些常量 QString
- 从 QLineEdits 中获取一些 QStrings
- 加 1 和 2
- 最后,单击按钮时将它们放入 QTextEdit。
对于第 1 步,我这样声明 QString:
QString set_1 = "ООО «Хеллманн» (129343, г. Москва, ул. Уржумская, д. 4, стр. 14, ИНН 7722637955, ОГРН 1087746168476) доверяет забор груза - ";
QString set_2 = " - перегружаемого из контейнера ";
QString set_3 = ", в количестве ";
QString set_4 = " паллет, весом ";
QString set_5 = " кг, водителю ";
QString set_6 = ", паспорт ";
QString set_7 = " выдан ";
QString set_8 = ".";
QString set_9 = " На автотранспортном средстве марки ";
QString set_10 = " - ";
QString set_11 = ", прицеп: ";
然后,对于第 2 步,我像这样从 QLineEdits 中创建 QStrings(例如 line_b_b 是 QLineEdit 的名称):
QString a = line_b_b.text();
QString b = line_b_a.text();
QString c = line_b_c.text();
QString d = line_b_d.text();
QString e = line_a_b.text();
QString f = line_a_a.text();
QString g = line_a_c.text();
QString h = line_a_d.text();
QString i = line_c_b.text();
QString j = line_c_a.text();
QString k = line_c_c.text();
对于第 3 步,我将第 1 步中的 QString 与第 2 步中的 QString 添加到名为 "doverka" 的变量中(请不要介意这些西里尔字符):
QString doverka = set_1+a+set_2+b+set_3+c+set_4+d+set_5+e+set_6+f+set_7+g+h+set_8+set_9+i+set_10+j+set_11+k+set_8;
最后,在第 4 步中,我尝试在按下按钮时将整体放入 QTextEdit。我想问题就在这里。我创建了一个名为 "text":
的 QTextEditQTextEdit text (&dw);
text.show();
然后我尝试创建一个插槽,我认为我这样做是完全错误的,因为它根本不起作用:
QPushButton btn_t ("Создать текст", &dw);
QObject::connect(
&btn_t,
SIGNAL(clicked()),
&text,
SLOT([dover](){return text.setText(doverka)}));
btn_t.show();
我是 Qt 和 C++ 的新手,这就是为什么插槽创建很差的原因。在这里,我尝试使用 lambda 函数进行此操作,但显然我做错了什么。也许我应该把 lambda 函数放在 SLOT
之前的其他地方?编译 prog 时我的插槽未被识别,我收到 "no such slot" 通知。或者问题可能出在更早的地方,例如从 QLineEdits 中制作 QStrings(第 2 步)?..我很无助,非常感谢任何有用的提示!非常感谢。
您正在尝试将旧式 Qt signal/slot 连接与显然不起作用的新式混合。 lambdas 只能用于新的连接方式。如果您使用的是 Qt 5,连接可能是这样的:
QObject::connect(
&btn_t,
&QPushButton::clicked,
[&text, &doverka](){
text.setText(doverka);
});
您应该注意 text
和 doverka
对象不应在调用 lambda 之前销毁,因为它们是通过引用捕获的。
如果使用 Qt 4.*,您应该使用旧语法。在您的情况下,只需在 class 中提供一个插槽并连接信号即可:
QObject::connect(
&btn_t,
SIGNAL(clicked()),
this,
SLOT(onClicked()));
您的 class 应继承自 QObject
并包含如下插槽:
public slots:
void onClicked() {
text.setText(doverka);
}
另请注意 text
和 doverka
应该是 class 的成员。