我对任何形式的编程都很陌生,但我必须用Qt为我的"工程师编程"做一个项目。课程,我们同时学习基础的c++。
我必须将文本从一个lineEdit显示到另一个窗口的lineEdit。
我有一个从主窗口打开的userWindow,在这个userWindow中,我有一个lineEdit小部件,它将当前选择的用户显示为QString(来自带有. dirname()的QDir对象)。但是现在我必须在主窗口的lineEdit中显示相同的字符串。
从我读到的,我必须这样做&;connect(…)&;我以前在单个。cpp文件内做过小部件,但现在我需要将ui对象和信号从一个窗口连接到另一个窗口,我正在挣扎。
我的想法/我在网上找到的是这样的:
userWindow.cpp
#include "userwindow.h"
#include "ui_userwindow.h"
#include "mainwindow.h"
#include <QDir>
#include <QMessageBox>
#include <QFileDialog>
#include <QFileInfo>
QDir workingUser; //this is the current selected user. I tried defining it in userWindow.h but that wouldn't work how I needed it to but that's a different issue
userWindow::userWindow(QWidget *parent) : //konstruktor
QDialog(parent),
ui(new Ui::userWindow)
{
ui->setupUi(this);
QObject::connect(ui->outLineEdit, SIGNAL(textChanged()), mainWindow, SLOT(changeText(workingUser) //I get the error " 'mainWIndow' does not refer to a value "
}
[...]
mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDir>
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void changeText(QDir user); //this is the declaration of my custom SLOT (so the relevant bit)
private slots:
void on_userButton_clicked();
void on_settingsButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "userwindow.h"
#include "settingswindow.h"
#include "click_test_target.h"
#include "random_number_generator.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
[...]
}
[...]
//here I define the slot
void MainWindow::changeText(QDir user)
{
QString current = user.dirName();
ui->userLine->insert("The current working directory is: "); //"userLine" is the lineEdit I want to write the text to
ui->userLine->insert(current);
}
我知道我对SLOT的对象做了一些错误的事情,但不知道如何正确地做。
如果有人能帮助我,我将非常感激。或者:也许有另一种方法可以在多个窗口中将文本从一个lineEdit镜像到另一个lineEdit。如果有人能分享一种方法,我将同样感激。有没有办法定义变量QDir workingUser;在这样一种方式,以便能够访问和覆盖它在所有我的。cpp文件?
提前感谢您的任何帮助。认为,
亚历山大·m .
我得到错误'mainWindow'未引用值';
我没有看到你有任何"mainWindow"任何地方的命名变量,但您也提到MainWindow
是父节点,这意味着您可以随时获得引用,例如:
MainWindow *mainWindow = qobject_cast<MainWindow *>(this->parent());
另外,您的信号处理程序(changeText(...)
插槽)应该将QString
作为参数(而不是QDir
),这样您就可以处理如何准确地处理转换,以防用户在输入字段(文本编辑)中键入一些随机文本。
void changeText(const QString &input);
最后,您需要指定类型:
QObject::connect(ui->outLineEdit, SIGNAL(textChanged(QString)), mainWindow, SLOT(changeText(QString));
或者,使用新的Qt-5语法:
connect(ui->outLineEdit, &QLineEdit::textChanged,
mainWindow, &MainWindow::changeText);
您可以创建新的信号(相同的参数lineEdit的textChanged) userWindow连接到lineEdit的textChanged信号。然后将信号userWindow连接到mainWindow的插槽。
//In userWindow.h
signals:
void textChanged(const QString&);
//In userWindow.cpp
connect(ui.lineEdit, &QLineEdit::textChanged, this, &userWindow::textChanged);
//In mainWindow.cpp
connect(userWindow, &userWindow::textChanged, this, &mainWindow::onTextChanged
然后在onTextChanged中写入相同的文本到mainWindow的lineEdit