在Qt中写入UI
write to UI in Qt
这可能是
我需要做的简单事情,我也在尝试从 1 个以上的类访问 u,它在主窗口类中有效,但在 Socket 类中不起作用。我想从套接字类写入 ui 的显示,但是当我键入 ui 时。它应该自动创建UI->并为我提供一堆选项。这是主窗口。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
#include "studentlist.h"
#include "student.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *ui;
private slots:
void on_buttonGraduate_clicked();
void on_buttonAverage_clicked();
void on_buttonDisplay_clicked();
void on_buttonAddModule_clicked();
void acceptNewStudent();
void processFinished(int);
protected:
private:
QProcess* process;
StudentList* studentList;
void displayDetail(QString msg, AbstractStudent* asp);
int doCheck();
void closeEvent(QCloseEvent *);
};
#endif // MAINWINDOW_H
和套接字。
#ifndef SOCKET_H
#define SOCKET_H
#include <QObject>
#include <QDebug>
#include <QTcpSocket>
#include <QAbstractSocket>
#include <QMainWindow>
#include "mainwindow.h"
#include "ui_mainwindow.h"
class Socket : public QObject
{
Q_OBJECT
public:
explicit Socket(QObject *parent = 0);
void run();
signals:
public slots:
void connected();
void disconnected();
void bytesWritten(qint64 bytes);
void readyRead();
private:
QTcpSocket *socket;
};
#endif // SOCKET_H
添加.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QMessageBox>
#include <QFile>
#include "studentserializer.h"
#include <QTextStream>
#include <QCloseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
process = 0;
studentList = StudentList::getInstance();
}
MainWindow::~MainWindow()
{
delete process;
delete ui;
}
void MainWindow::on_buttonAddModule_clicked()
{
process = new QProcess(this);
process->start("C:/Unisa/COS3711/Solutions to assignment 2/S2A2Q4ProcessStudent-build-desktop/debug/S2A2Q1GetStudent.exe");
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(acceptNewStudent()));
connect(process, SIGNAL(finished(int)), this, SLOT(processFinished(int)));
}
void MainWindow::acceptNewStudent()
{
QByteArray bytes = process->readAllStandardOutput();
QStringList items = QString(bytes).split("#");
QString number = items.at(0);
QString module = items.at(1);
int mark = items.at(2).toInt();
//check if student already exists
int index = studentList->exists(number);
if (index == -1) // student does not yet exist
{
Student* student = new Student;
student->setNumber(number);
student->addModule(module, mark);
studentList->addStudent(student);
displayDetail("New student added", student);
}
else // student does exist
{
AbstractStudent* a = studentList->getStudent(index);
a->addModule(module, mark);
displayDetail("Updated student", a);
a = 0;
}
}
void MainWindow::on_buttonDisplay_clicked()
{
int index = doCheck();
if (index >=0)
{
AbstractStudent* asp = studentList->getStudent(index);
displayDetail("Displaying student", asp);
asp = 0;
}
}
void MainWindow::displayDetail(QString msg, AbstractStudent* asp)
{
ui->display->clear();
ui->display->append(msg);
ui->display->append("Number: " + asp->getNumber());
QMap<QString, int> mods = asp->getModules();
QMapIterator<QString, int> i(mods);
while (i.hasNext())
{
i.next();
ui->display->append("Module: " + i.key() + " Mark: " + QString::number(i.value()));
}
}
void MainWindow::on_buttonAverage_clicked()
{
int index = doCheck();
if (index>=0)
{
AbstractStudent* asp = studentList->getStudent(index);
displayDetail("Displaying student", asp);
ui->display->append("Module average: " + QString::number(asp->average()));
asp = 0;
}
}
void MainWindow::on_buttonGraduate_clicked()
{
int index = doCheck();
if (index>=0)
{
AbstractStudent* asp = studentList->getStudent(index);
QString msg = asp->graduate()?"This student graduates":"This student does not graduate";
displayDetail(msg, asp);
asp = 0;
}
}
int MainWindow::doCheck()
{
QMessageBox warning;
warning.setIcon(QMessageBox::Critical);
int index=-1;
if (ui->studentNumber->text().size() == 0)
{
warning.setText("Provide a number");
warning.exec();
index = -1;
}
else
{
index = studentList->exists(ui->studentNumber->text());
if (index == -1)
{
warning.setText("Number does not exist");
warning.exec();
}
}
ui->studentNumber->clear();
ui->studentNumber->setFocus();
ui->display->clear();
return index;
}
void MainWindow::closeEvent(QCloseEvent* event)
{
QFile studentFile("studentlist.xml");
studentFile.open(QIODevice::WriteOnly);
QTextStream toFile(&studentFile);
StudentSerializer s;
QList<AbstractStudent*>* list = studentList->returnList();
for (int i=0; i<list->size(); i++)
s.addStudent(list->at(i));
QDomDocument tempDoc = s.getDoc();
toFile << tempDoc.toString();
studentFile.close();
event->accept();
}
void MainWindow::processFinished(int)
{
process->close();
process->deleteLater();
process=0;
}
和插座.cpp
#include "socket.h"
Socket::Socket(QObject *parent) :
QObject(parent)
{
}
void Socket::run(){
socket = new QTcpSocket(this);
connect(socket,SIGNAL(connected()),this,SLOT(connected()));
connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(socket,SIGNAL(bytesWritten(qint64)),this,SLOT(bytesWritten(qint64)));
qDebug() << "Connecting...";
socket->connectToHost("twitter.com",80);
if (!socket->waitForConnected(3000))
{
qDebug() << "error:" << socket->errorString();
}
}
void Socket::connected(){
qDebug() << "Connected";
}
void Socket::disconnected(){
qDebug() << "Disconected";
}
void Socket::bytesWritten(qint64 bytes){
qDebug() << "we wrote: " << bytes;
}
void Socket::readyRead(){
qDebug() << "Reading...";
socket->readAll();
}
那些qDebug的我想写给QTextEdit称为显示
Qt有信号槽机制来做这样的事情!
您永远不能从工作线程访问 GUI。
在Socket
内创建信号,并在QMainWindow
内创建适当的插槽。然后,您可以将一些QString
发送到GUI。
主窗口.h:
public slots:
void showMessage( const QString& message );
private:
QLabel* label_; // or something similar
主窗口.cpp:
void MainWindow::showMessage( const QString& message )
{
// dont forget to create label_ within the ctor
this->label_->setText(message) // or something similar
}
套接字:
signals:
void sendMessage( const QString& message ) const;
插座.cpp:
// add or replace the qDebug() part with
emit this->sendMessage("DEBUG MESSAGE");
此外,连接MainWindow
和Socket
类:
QObject::connect(sender*, &Socket::sendMessage, receiver*, &MainWindow::showMessage);
// or Qt 4 style
// QObject::connect(sender*, SIGNAL(sendMessage(QString), receiver*, SLOT(showMessage(QString));
您的套接字类是否在不同的线程中运行?如果是这样,则不允许直接访问 UI。如果没有,您必须为套接字类提供一个指向 ui 的指针,但我不建议这样做。
首选的解决方案是在套接字类中创建一个信号,并将其连接到主窗口类中的插槽。在这个插槽中,做你想要的用户界面工作。在套接字类中,只需在给定时间发出信号,信号可以保存发送到插槽的数据对象。
相关文章:
- 如何在MS Visual Studio 2019中运行QT UI
- 根据变量使Qt UI中的复选框为已选中/未选中
- Qt Quick,如何更改 Ui 源代码?
- Qt - QQuickWidget setSource without freezing UI
- 可以在JSON文件的帮助下在Qt中创建UI表单
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- 一个 ui 成员的 Qt 连接和同一连接中的两个信号
- 如何抓取指向Qt中弹出对话框的指针,该对话框阻止了QTest中的UI线程
- 如何在Qt Designer UI文件中清除QMainWindow的几何标记
- 当我使用 GUI 开发 QT 动态库时,如何查看我的 QT UI?
- 如何从 bash 脚本捕获终端输出并将其显示在我的 Qt UI 中?
- 如何使用.UI文件在QT Creator中使用CMAKE制作GUI QT项目
- Qt 自动 UI 测试因消息框而停止.如何在消息框中模拟输入?
- 如何在QT中为两个项目使用单个UI
- 如何在Qt中打开新窗口的情况下更改UI?
- QT Creator不会更新.UI文件和设计器
- 一个人如何将QT(C )UI分为多个小部件子类,并使其显示与同一类中的所有窗口
- 用QT形式顺序命名的UI对象填充数组
- 如何创建第二个 QT .ui 表单
- 通过 qt 对发送方和接收方使用自动生成的 Ui