前言

QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式:

1.将ui指针公开后直接访问

(1)例如有个自己定义的类CustomClass,在自定义类里包含主界面指针MainWindow *

class MainWindow;class CustomClass
{
public:CustomClass(MainWindow * parent);MainWindow * mainwidow;void SetUI();
};

(2)主界面类将成员Ui::MainWindow *ui 从私有private移动到public公共

class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();Ui::MainWindow *ui;CustomClass* customclass;
private:
}

(3)自定义类包含头文件:#include "ui_mainwindow.h",构造的时候传入界面指针MainWindow*,就能通过 mainwidow->ui指针访问UI控件了。

#include "mainwindow.h"
#include "ui_mainwindow.h"CustomClass::CustomClass(MainWindow * parent)
{this->mainwidow = parent;
}void CustomClass::SetUI()
{mainwidow->ui->pushButton->setText("开始");
}

记得要引用ui_mainwindow.h,不然会报错误:

error: member access into incomplete type 'Ui::MainWindow'

forward declaration of 'Ui::MainWindow'

2.封装成公共函数

(1)所有对UI的操作都在主界面MainWindow类中,并封装成公共的函数

class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void SetUI();CustomClass* customclass;
private:   Ui::MainWindow *ui;
}void MainWindow::SetUI()
{this->ui->pushButton->setText("开始");
}

(2)其他类要访问UI调用函数就好了

CustomClass::CustomClass(MainWindow * parent)
{this->mainwidow = parent;this->mainwidow->SetUI();
}

3.通过控件指针访问

如果每次只访问一两个控件的话,也可以直接将控件指针传给自定义类

    customclass=new CustomClass(this);customclass->SetUI(ui->pushButton);
void CustomClass::SetUI(QPushButton* btn)
{btn->setText("开始");
}

4.通过信号和槽访问

前面的方法一般够用了,但如果是多线程就必须用到信号和槽机制,因为非UI线程不能跨线程访问UI,例如定义一个线程类

class MyThread :public QThread
{Q_OBJECT
public:MyThread(MainWindow *parent);MainWindow * mainwidow;void run() override;
};

在主界面MainWindow类里有信号setui,和槽函数SetUI,所有对 UI的操作都封装在槽函数函数中

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//关联信号connect(this,&MainWindow::setui,this,&MainWindow::SetUI);mythread = new MyThread(this);mythread->start();//启动线程
}void MainWindow::SetUI()
{this->ui->pushButton->setText("开始");
}

在非UI线程里需要访问Ui通过发送信号就行了,槽函数会在UI线程中被执行

void MyThread::run()
{//发送信号,修改UIemit this->mainwidow->SetUI();exec();
}

当然信号和槽很灵活,不一定在多线程中,有需要都可以用。

QT 自定义类访问UI控件的几种方法相关推荐

  1. qt自定义类访问ui控件

    比如想在类A中访问mainwindow里面的LineEdit. 在类A里面定义一个 QLineEdit *ed;然后就可以用ed->setText()这些函数. 然后在mainwindow里面实 ...

  2. QT-子线程或自定义类操作访问主界面UI控件的几种方法

    前言 QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式: 1.将ui指针公开后直接访问 (1)例如有个自己 ...

  3. c#,c++,qt中多线程访问UI控件线程的问题汇总

    c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件. c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke ...

  4. html页面如何引用母版页,内容页面访问母版页控件的两种方法

    母版页是ASP.NET2.0新增的一个功能,使用它可以更方便.更快速的创建风格一致的应用程序..NET的母版页和Dreamweaver的模板非常的相似,但.NET的母版页更加强大,它除了能够实现创建风 ...

  5. MFC中访问界面控件的两种方法

    1.在资源中创建一个对话框资源,放置一些控件,然后使用类向导创建一个此对话框类型的变量,项目中会自动创建此对话框的.h和.cpp文件. 有两种方式可在代码中访问控件. (1)如果在代码中直接访问,则使 ...

  6. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  7. 线程访问 DevExpress控件异常时 解决方法

    线程访问 DevExpress控件异常时 解决方法 Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyD ...

  8. excel日历弄到html,Excel中进行添加日历控件的两种方法

    有时我们在运用Excel表格的时候会运用到日历的控件,可是小伙伴们却不知道在哪里添加.那么我们来看一下,它到底躲藏在哪里,又该怎么添加呢?今天,学习啦小编就教大家在Excel中进行添加日历控件的两种方 ...

  9. 访问母版页控件、属性、方法及母版页中调用内容页的方法

    首先,必须通过内容页中的MasterTye指令,对母版页实施强类型化,即在内容页代码头的设置中增加如下指令 <%@ MasterType VirtualPath="~/Master/M ...

  10. HTML中禁用表单控件的两种方法readonly与disabled

    时候我们会希望表单上的控件是不可修改的,比如在修改密码的网页中,显示用户名的文本框就应该是不可修改状态的,下面与大家分享下禁用表中控件的两种方法 在网页的制作过程中,我们会经常使用到表单.但是有时候我 ...

最新文章

  1. Flask的快速入门详细笔记
  2. 为什么很多技术合伙人参与创业时会先谈钱?
  3. Firefox年内将默认启用AV1解码
  4. 你这飞机会爆炸吗?航空公司含泪甩卖49元机票,却被超模君挖出秘密!
  5. 转载:ASP.NET在后台代码实现个功能,根据选择提示用户是否继续执行操作
  6. 7004.vue脚手架快速生成项目
  7. 关于微信退款出现错误代码:52的解决方法【转】
  8. 第一次使用博客及Coursera课程体验
  9. java 编程规范 check list
  10. PYTHON面向对象编程基础知识
  11. css权威指南笔记,《CSS权威指南》读书笔记(1)
  12. Bad CPU type in executable
  13. 我的第一份实习工作结束了!!!
  14. linux常用命令导图
  15. Python 05-字符串
  16. Android入门知识全套笔记
  17. 毕业季基于spring的基于安卓APP的基于ssm框架的基于微信小程序的管理系统设计与开发(开题+源码+讲解+论文)
  18. Fuchsia 的开发语言政策与解读
  19. 146 朝阳区劳动仲裁的经历
  20. jQuery中国省份地图悬浮层简介js特效代码

热门文章

  1. Caused by: org.apache.spark.SparkException: This RDD lacks a SparkContext. It could happen in the
  2. java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x01错误解决
  3. Android创建本地文件时没有权限的怪现象
  4. 软件人员kpi制定模板_绩效考核软件有哪些,员工绩效考核制度模板
  5. SQL注入SQLmap简单用法,和SQL注入写入一句话木马
  6. 关于iPhone 5的适配
  7. 金蝶商贸版,后台修改序时簿过滤条件
  8. vs怎么换背景颜色?
  9. 硬件原理图 一键开关机电路
  10. 第三方公众号用 微信联合 登录