QT 自定义类访问UI控件的几种方法
前言
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控件的几种方法相关推荐
- qt自定义类访问ui控件
比如想在类A中访问mainwindow里面的LineEdit. 在类A里面定义一个 QLineEdit *ed;然后就可以用ed->setText()这些函数. 然后在mainwindow里面实 ...
- QT-子线程或自定义类操作访问主界面UI控件的几种方法
前言 QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式: 1.将ui指针公开后直接访问 (1)例如有个自己 ...
- c#,c++,qt中多线程访问UI控件线程的问题汇总
c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件. c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke ...
- html页面如何引用母版页,内容页面访问母版页控件的两种方法
母版页是ASP.NET2.0新增的一个功能,使用它可以更方便.更快速的创建风格一致的应用程序..NET的母版页和Dreamweaver的模板非常的相似,但.NET的母版页更加强大,它除了能够实现创建风 ...
- MFC中访问界面控件的两种方法
1.在资源中创建一个对话框资源,放置一些控件,然后使用类向导创建一个此对话框类型的变量,项目中会自动创建此对话框的.h和.cpp文件. 有两种方式可在代码中访问控件. (1)如果在代码中直接访问,则使 ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...
- 线程访问 DevExpress控件异常时 解决方法
线程访问 DevExpress控件异常时 解决方法 Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyD ...
- excel日历弄到html,Excel中进行添加日历控件的两种方法
有时我们在运用Excel表格的时候会运用到日历的控件,可是小伙伴们却不知道在哪里添加.那么我们来看一下,它到底躲藏在哪里,又该怎么添加呢?今天,学习啦小编就教大家在Excel中进行添加日历控件的两种方 ...
- 访问母版页控件、属性、方法及母版页中调用内容页的方法
首先,必须通过内容页中的MasterTye指令,对母版页实施强类型化,即在内容页代码头的设置中增加如下指令 <%@ MasterType VirtualPath="~/Master/M ...
- HTML中禁用表单控件的两种方法readonly与disabled
时候我们会希望表单上的控件是不可修改的,比如在修改密码的网页中,显示用户名的文本框就应该是不可修改状态的,下面与大家分享下禁用表中控件的两种方法 在网页的制作过程中,我们会经常使用到表单.但是有时候我 ...
最新文章
- Flask的快速入门详细笔记
- 为什么很多技术合伙人参与创业时会先谈钱?
- Firefox年内将默认启用AV1解码
- 你这飞机会爆炸吗?航空公司含泪甩卖49元机票,却被超模君挖出秘密!
- 转载:ASP.NET在后台代码实现个功能,根据选择提示用户是否继续执行操作
- 7004.vue脚手架快速生成项目
- 关于微信退款出现错误代码:52的解决方法【转】
- 第一次使用博客及Coursera课程体验
- java 编程规范 check list
- PYTHON面向对象编程基础知识
- css权威指南笔记,《CSS权威指南》读书笔记(1)
- Bad CPU type in executable
- 我的第一份实习工作结束了!!!
- linux常用命令导图
- Python 05-字符串
- Android入门知识全套笔记
- 毕业季基于spring的基于安卓APP的基于ssm框架的基于微信小程序的管理系统设计与开发(开题+源码+讲解+论文)
- Fuchsia 的开发语言政策与解读
- 146 朝阳区劳动仲裁的经历
- jQuery中国省份地图悬浮层简介js特效代码
热门文章
- Caused by: org.apache.spark.SparkException: This RDD lacks a SparkContext. It could happen in the
- java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x01错误解决
- Android创建本地文件时没有权限的怪现象
- 软件人员kpi制定模板_绩效考核软件有哪些,员工绩效考核制度模板
- SQL注入SQLmap简单用法,和SQL注入写入一句话木马
- 关于iPhone 5的适配
- 金蝶商贸版,后台修改序时簿过滤条件
- vs怎么换背景颜色?
- 硬件原理图 一键开关机电路
- 第三方公众号用 微信联合 登录