精华内容
下载资源
问答
  • QtUI一二三

    千次阅读 2017-01-19 21:57:33
    QtUI一二三 大多数人使用Qt并不使用Qt的UI,因为有一部分人是使用VS编写Qt,还有一部分人,认为UI设计太过复杂,不如手写来的酸爽,但对于像我这种Qt初学者来说手写太难,不得不先画UI来完成初期的学习。 以下是我...

    QtUI一二三

    大多数人使用Qt并不使用Qt的UI,因为有一部分人是使用VS编写Qt,还有一部分人,认为UI设计太过复杂,不如手写来的酸爽,但对于像我这种Qt初学者来说手写太难,不得不先画UI来完成初期的学习。

    以下是我个人对QtUI的一些简单的理解。

    ui_Dialog.h

    我们使用Qt Creator的设计师设计了一个名为Dialog.ui的文件,在Qt Creator后台自动调用了一个.exe程序将绘制的Dialog.ui进行翻译,翻译生成ui_Dialog.h文件。

    文件ui_Dialog.h主要由两部分组成,分别是类Ui_Dialog的定义和声明类Dialog在命名空间Ui中。

    class Ui_Dialog

    该类包含了用户绘制的Dialog.ui中所使用的所有控件对象,比如在Dialog.h中画一个button,则类Ui_Dialog中成员对象就会有一个与之对应的button子对象。
    其中还包括Dialog.ui中绘制的关于大小、高度等等的布局程序,皆由代码实现。

    声明类dialog

    在ui_Dialog.h文件中还会声明类Dialog,声明其在命名空间Ui中,格式为:
    namespace Ui {
        class Dialog : public Ui_Dialog {};
    } // namespace Ui
    由于class Ui_Dialog中所有的成员和方法皆为public,所以class Dialog包含class  Ui_Dialog中所有的界面布局。

    class Dialog

    类Dialog定义文件Dialog.h中会再次声明类Dialog在命名空间Ui中,格式如下:

    namespace Ui {
    class Dialog;
    }
    类Dialog定义私有子对象成员Ui::Dialog *ui,根据前面的解析,子对象ui实际拥有关于界面的一切,更新界面的所有操作都是子对象ui实现的。
    子对象来自于Ui::Dianlog所以类Dialog构造前需要先构造ui,格式如下:
    Dialog::Dialog(QWidget *parent) :
    QDialog(parent),//其他的也一样如 main window
    ui(new Ui::Dialog)
    {}

    当然子对象ui需要自行析构,格式如下:
    Dialog::~Dialog()
    {
        delete ui;
    }
    展开全文
  • VS2015下封装Qt ui界面为dll的做法

    千次阅读 2020-04-30 09:40:17
    VS2015下封装Qt ui文件为dll的做法 ​ 最近被要求将以前项目的比较复杂的ui界面及其内部函数封装成dll,在网上查阅了一些资料,发现大部分要么是vs封装qt无界面的,要么是qt creator封装成dll的,有一篇较好的参考是...

    VS2015下封装Qt ui文件为dll的做法

    ​ 最近被要求将以前项目的比较复杂的ui界面及其内部函数封装成dll,在网上查阅了一些资料,发现大部分要么是vs封装qt无界面的,要么是qt creator封装成dll的,有一篇较好的参考是https://blog.csdn.net/qq_30547073/article/details/81147098 ,是通过代码设计ui的,虽然比较麻烦,但也算是将ui封装成了dll并可以调用,那么如何直接封装ui文件呢,我探索了下发现可行,这里将过程分享一下(前面过程看上边的博客)。

    项目添加新建项ui文件,然后去qt设计师可以任意设计。
    在这里插入图片描述
    在这里插入图片描述

    右键编译
    在这里插入图片描述

    右键ui文件点击属性,可以看到ui.h文件生成的位置

    在这里插入图片描述

    找到相应位置,添加到项目的包含目录,其他做法就跟正常的qt工程新建ui文件一致了。

    #pragma once
    
    #include "qtclasslibrary429_global.h"
    #include <iostream>
    
    #include<QtWidgets\qwidget.h>
    #include<QtWidgets\qpushbutton.h>
    #include "ui_Widget.h"
    
    class QTCLASSLIBRARY429_EXPORT QtClassLibraryTest : public QWidget
    {
    	Q_OBJECT
    
    public:
    	explicit QtClassLibraryTest(QWidget * parent = 0);
    	~QtClassLibraryTest();
    
    	private slots:
    
    
    private:
     
    	Ui::Form ui;
    };
    
    

    最终效果:

    在这里插入图片描述

    参考博客:https://blog.csdn.net/qq_30547073/article/details/81147098

    展开全文
  • 到 creator,QT UI文件的变化 转帖! 转自 分享自己一些对qt的理解(原创) 一些关于qt3和qt4的理解 如果你用过了qt3,也用过qt4的话,肯定觉得变化很大,不是吗? qt4没有了pro文件的管理 ...
    
    

    从 QT3 到 QT4, designer 到 creator,QT UI文件的变化

    转帖!

    转自 分享自己一些对qt的理解(原创)

    一些关于qt3和qt4的理解

    如果你用过了qt3,也用过qt4的话,肯定觉得变化很大,不是吗?
    qt4没有了pro文件的管理
    Removed project manager. Qt Designer now only reads and edits .ui files. It has no notion of a project (.pro file)
    Qt4改变了.ui的文件格式,虽然提供了转化工具,大家还是觉得不好玩。
    Changed format of .ui files. Qt Designer 4 cannot read files created by Qt Designer 3 and vice versa. However, we provide the tool uic3 to generate Qt 4 code out of Qt 3 .ui files, and to convert old .ui files into a format readable by Qt Designer 4.
    更抠门的是,居然连c++的编辑器也不给我们用。
    Removed code editor. Qt Designer can no longer be used to edit source files.
    更深入一层来说,看一些qt4提供的例子,怎么觉得有点不大像qt3 c++的习惯,c++是可以这样的吗?qt4中自己的槽在哪里添加啊?

    同样我们也会对qt3以前的.ui.h这个文件感到有点纳闷,看上去是头文件,但是进去看怎么看都觉得像是观念中的源文件,因为毕竟里面是实现特殊函数――槽(SLOT)功能的地方。

    更烦的是,Qt3中用designer设计好了的.pro文件,然后用vc工具打开,添加一些自己改动,等到下次由于编译需要clean一下,再次用工具打开pro文件,天哪,我辛辛苦苦添加的东西到哪里去了啊?!!

    本文试着根据自身的一些实践,结合论坛中的一些网友遇到的问题,说说自己的看法,希望能抛砖引玉,对大家学习qt有所帮助。

    按照历史顺序,首先说qt3。

    在qt3或者以前的版本中,可能大家的习惯做法是,打开designer,添加pro文件,设置头文件路径,设置是app还是lib,设置要连接lib的路径和对应的lib的名称;接着开始新建一个dialog,在上面添加按钮,然后保存成.ui文件;开始写main函数,像我这么懒的人,main函数都是根据designer生成的。一切都顺利的话,你可以选择开始qmake了,接着make(或者nmake等等);如果在WINDOWS下,也可以选择用vc中的qt工具栏打开pro文件,编译链接,一般情况下,你都会很高兴的看到自己第一个qt的界面。

    对了,要添加自己的槽呢?
    你可以在(Object)下面的Member选项卡里面找到Slot一项,添加一个槽,如果你在某个slot点击Edit的话,qt就会弹出一个窗口,这个窗口上面提到的.ui.h的文件所在。如果想初始化自己定义的一些变量,可以在function里面添加init()函数,当添加完以后,你会发现后面会多了(Constructor)这个东西,其实在.ui.h前面那段注释的代码里面就说得很清楚了,
    /****************************************************************************
    ** ui.h extension file, included from the uic-generated form implementation.
    **
    ** If you want to add, delete, or rename functions or slots, use
    ** Qt Designer to update this file, preserving your code.
    **
    ** You should not define a constructor or destructor in this file.
    ** Instead, write your code in functions called init() and destroy().
    ** These will automatically be called by the form's constructor and
    ** destructor.
    *****************************************************************************/

    也可以通过打开根据ui生成的Form1.cpp看到,类的构造函数的最后面调用了init()这个函数,这个函数在没有添加的时候是没有出现在ui生成的Form1.cpp文件里面的。init()对应的就是destory()了,这个就不多说了。

    不喜欢Form1这个类的名字,要改变类的名字怎么办?可以在ui上面点击右键选择Form setting ,在弹出的对话框里面会看到class name的一项,在那里写上自己喜欢的类名吧。这个类名就是相当于Form1,Form1怎么用,这个类就怎么用。

    大家是不是觉得这些步骤很像vc的做法呢?具体点就是MFC的做法呢?

    也有一些网友会根据qt文档里面的说法去做:写好了.h文件和.cpp文件,接着用
    qmake –project
    这样的方法来生成pro文件,个人觉得这样的做法不提倡,为什么呢?因为一般来说一个工程都要包含其他目录下的头文件,需要链接别的不是qt的库,这样的话就要对每次生成的pro文件进行添加修改,不是很方便。其次,有人喜欢把头文件和源文件分别放在不同的目录下,这样的话管理很方便,但是
    qmake –project
    只对当前目录下的头文件和源文件起作用。
    至少在windows下,用
    qmake –project
    生成pro文件的话,后面的生成的.obj文件就很乱的
    最好还是在designer里面的pro设置里面做这些吧。

    论坛里面的有些牛人自己写pro文件的,这个就不是本人能够到达的境界了,没有能力在这里讨论了。

    不管怎样,不就是为了得到Makefile吗?下面就专门看它怎么发飙了?
    插播一下,真的要谢谢qmake,它那么容易就让我们得到了Makefile,Makefile是什么?!后面的一切都是听他指挥的,要是我们自己写的话,像我怎么懒的人才不写呢!!况且我也不大会写呢~_~

    随便用一个文本编辑器打开Makefile,大概会看到下面的一些东西吧qt332版本的

    #############################################################################
    # Makefile for building: myqt332test
    # Generated by qmake (1.07a) (Qt 3.3.2) on: Thu Jun 08 22:41:07 2006
    # Project: myqt332test.pro
    # Template: app
    # Command: $(QMAKE) -o Makefile myqt332test.pro
    #############################################################################

    ####### Compiler, tools and options

    CC = cl
    CXX = cl
    LEX = flex
    YACC = byacc
    CFLAGS = -nologo -Zm200 -W3 -MDd -Zi -Gm -DUNICODE -DWIN32 -DQT_DLL -DQT_THREAD_SUPPORT
    CXXFLAGS = -nologo -Zm200 -W3 -w34100 -w34189 -MDd -Zi -Gm -DUNICODE -DWIN32 -DQT_DLL -DQT_THREAD_SUPPORT
    LEXFLAGS =
    YACCFLAGS =-d
    INCPATH = -I"$(QTDIR)\include" -I"D:\qttest\myqt332test" -I"D:\QT332\mkspecs\win32-msvc.net"
    LINK = link
    LFLAGS = /NOLOGO /DEBUG /SUBSYSTEM:WINDOWS /LIBPATH:"$(QTDIR)\lib"
    LIBS = "qt-mt332.lib" "qtmain.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "imm32.lib" "winmm.lib" "wsock32.lib" "winspool.lib" "delayimp.lib" "opengl32.lib" "glu32.lib"
    MOC = $(QTDIR)\bin\moc.exe
    UIC = $(QTDIR)\bin\uic.exe
    QMAKE = qmake
    IDC = $(QTDIR)\bin\idc.exe
    IDL = midl
    ZIP = zip -r -9
    COPY_FILE = copy
    COPY_DIR = copy
    DEL_FILE = del
    DEL_DIR = rmdir
    MOVE = move
    CHK_DIR_EXISTS = if not exist
    MKDIR = mkdir
    INSTALL_FILE= $(COPY_FILE)
    INSTALL_DIR = $(COPY_DIR)

    ####### Files

    HEADERS = 
    SOURCES = main.cpp
    OBJECTS = main.obj \
    myqt332test.obj
    FORMS = myqt332test.ui
    UICDECLS = myqt332test.h
    UICIMPLS = myqt332test.cpp
    SRCMOC = moc_myqt332test.cpp
    OBJMOC = moc_myqt332test.obj
    DIST = 
    TARGET = myqt332test.exe

    ####### Implicit rules

    .SUFFIXES: .c .cpp .cc .cxx .C

    {.}.cpp{}.obj::
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo @<<
    $<
    <<

    {.}.cc{}.obj::
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo @<<
    $<
    <<

    {.}.cxx{}.obj::
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo @<<
    $<
    <<

    {.}.C{}.obj::
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo @<<
    $<
    <<

    {.}.c{}.obj::
    $(CC) -c $(CFLAGS) $(INCPATH) -Fo @<<
    $<
    <<

    ####### Build rules

    all: Makefile $(TARGET)

    $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) 
    $(LINK) $(LFLAGS) /OUT:$(TARGET) @<< 
    $(OBJECTS) $(OBJMOC) $(LIBS)
    <<


    mocables: $(SRCMOC)
    uicables: $(UICIMPLS) $(UICDECLS)

    Makefile: myqt332test.pro D:\QT332\mkspecs\win32-msvc.net\qmake.conf ..\..\QT332\lib\qtmain.prl
    $(QMAKE) -o Makefile myqt332test.pro
    qmake: 
    @$(QMAKE) -o Makefile myqt332test.pro

    dist:
    $(ZIP) myqt332test.zip $(SOURCES) $(HEADERS) $(DIST) $(FORMS) D:/qttest/myqt332test/myqt332test.pro ..\..\QT332\lib\qtmain.prl myqt332test.ui.h 

    uiclean:
    -$(DEL_FILE) myqt332test.h
    -$(DEL_FILE) myqt332test.cpp
    mocclean:
    -$(DEL_FILE) moc_myqt332test.cpp
    -$(DEL_FILE) moc_myqt332test.obj
    clean: uiclean mocclean
    -$(DEL_FILE) main.obj
    -$(DEL_FILE) myqt332test.obj
    -$(DEL_FILE) myqt332test.pdb
    -$(DEL_FILE) myqt332test.ilk
    -$(DEL_FILE) vc*.pdb
    -$(DEL_FILE) vc*.idb




    FORCE:

    distclean: clean
    -$(DEL_FILE) $(TARGET)

    ####### Compile

    main.obj: main.cpp \
    myqt332test.h \


    myqt332test.h: myqt332test.ui 
    $(UIC) myqt332test.ui -o myqt332test.h

    myqt332test.cpp: myqt332test.h myqt332test.ui 
    $(UIC) myqt332test.ui -i myqt332test.h -o myqt332test.cpp

    myqt332test.obj: myqt332test.cpp \
    myqt332test.ui.h \
    myqt332test.h \


    moc_myqt332test.obj: moc_myqt332test.cpp myqt332test.h 

    moc_myqt332test.cpp: $(MOC) myqt332test.h
    $(MOC) myqt332test.h -o moc_myqt332test.cpp

    ####### Install

    install: 

    uninstall: 



    在里面,我们可以看到,myqt332test.h和myqt332test.cpp p是怎么生成,moc_*.cpp是怎么生成的,使用的是那个c++的编译器,clean的话会清除什么东西

    有点晕了吧,坚持一下,你会有收获的,关键来看看这里

    myqt332test.h: myqt332test.ui 
    $(UIC) myqt332test.ui -o myqt332test.h

    myqt332test.cpp: myqt332test.h myqt332test.ui 
    $(UIC) myqt332test.ui -i myqt332test.h -o myqt332test.cpp

    myqt332test.obj: myqt332test.cpp \
    myqt332test.ui.h \
    myqt332test.h \


    moc_myqt332test.obj: moc_myqt332test.cpp myqt332test.h 

    moc_myqt332test.cpp: $(MOC) myqt332test.h
    $(MOC) myqt332test.h -o moc_myqt332test.cpp

    myqt332test.h 是靠这句话生成的 $(UIC) myqt332test.ui -o myqt332test.h
    myqt332test.cpp 是靠这句话生成的 $(UIC) myqt332test.ui -i myqt332test.h -o myqt332test.cpp
    moc_myqt332test.cpp 是靠这句话生成的 $(MOC) myqt332test.h -o moc_myqt332test.cpp

    至于$(UIC) 和 $(MOC)是什么意思,?
    MOC = $(QTDIR)\bin\moc.exe
    UIC = $(QTDIR)\bin\uic.exe
    QMAKE = qmake

    一切的一切,都在Makefile里面说得清清楚楚。
    这也是经常提到的为什么我的一些修改会丢了呢?因为你的修改是在myqt332test.h和myqt332test.cpp里面的,clean以后 再次qmake会重新生成的。所以你要改什么控件的话,最好还是在designer里面修改,但是myqt332test.ui.h不一样,它不是生成的,不会被覆盖。其实myqt332test.ui.h里面是一些自己定义的东西,比如槽,比如变量的初始化,所以qt3的设计者就是要我们在myqt332test.ui.h里面写东西,在init()里面初始化,而不是像平时的c++一样,在myqt332test.h里面定义变量,跑到myqt332test.cpp里面写东西,这个在qt4里面改变了方式了,呵呵,不觉得myqt332test.ui.h有点怪怪的吗?

    在生成的myqt332test.cpp 里面可以看到,里面的控件是怎么创建的。

    myqt332test::myqt332test( QWidget* parent, const char* name, bool modal, WFlags fl )
    : QDialog( parent, name, modal, fl )
    {
    if ( !name )
    setName( "myqt332test" );

    pushButton1 = new QPushButton( this, "pushButton1" );
    pushButton1->setGeometry( QRect( 110, 115, 126, 26 ) );

    pushButton2 = new QPushButton( this, "pushButton2" );
    pushButton2->setGeometry( QRect( 110, 210, 131, 31 ) );

    textLabel1 = new QLabel( this, "textLabel1" );
    textLabel1->setGeometry( QRect( 370, 180, 81, 46 ) );
    languageChange();
    resize( QSize(600, 480).expandedTo(minimumSizeHint()) );
    clearWState( WState_Polished );
    init();
    }
    看到了吧,里面控件的父类都是this,在这里可能你觉得的很自然,到了qt4就不一样了,到qt4的时候再详细讨论。


    看完了makefile ,再来看看qt3的designer的一些特色。
    其实个人觉得qt4以前的designer很像vc,比如lib和include 的路径的设置,生成dll还是exe,新建一个槽或者函数,变量的添加,关键字的着色,都可以在designer里面做到,就差不能编译和调试,这也是很多人感到不爽的地方,qt4干脆就把这些砍掉,狠^_^

    不过layout这个东西确实让人耳恳恍拢 褂芯褪悄歉龅 ?,
    qt3大概就先说这些吧,以后想到什么再补吧,

    下面把目光放在qt4身上。对于designer来说,她确实苗条一些了。
    首先是生成的头文件的默认的名字由qt3的classname.h变成了ui_*.h,其次就是创建控件的方式有了很大不同,这或许是很多网友感到郁闷的地方,还有就是pro文件不再跟designer在一起了。更要命的是,很多控件类的名字都改变了。但是有一点值得肯定的是:事物总是朝着好的方向发展的。
    随便在designer里面画几个控件。保存.ui文件。然后写一个main函数
    大概是这个样子吧

    #include <qapplication.h>
    #include "ui_mytest.h"

    int main(int argc, char *argv[])
    {
    QApplication app(argc,argv);

    QWidget *dlg = new QWidget();
    Ui::mytest ui;
    ui.setupUi(dlg);

    dlg->show();

    return app.exec();
    }

    大家可能对这段身材比较感兴趣
    QWidget *dlg = new QWidget();
    Ui::mytest ui;
    ui.setupUi(dlg);

    dlg->show();

    为什么show的是dlg呢?setupUi到底做了什么?为什么要Ui::mytest ui这样定义呢?
    看头看尾,看来只好在ui_mytest.h里面找答案了;

    #ifndef UI_MYTEST_H
    #define UI_MYTEST_H

    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QLabel>
    #include <QtGui/QPushButton>
    #include <QtGui/QWidget>

    class Ui_mytest
    {
    public:
    QPushButton *pushButton;
    QLabel *label;
    QPushButton *pushButton_2;

    void setupUi(QWidget *mytest)
    {
    mytest->setObjectName(QString::fromUtf8("mytest"));
    mytest->resize(QSize(400, 300).expandedTo(mytest->minimumSizeHint()));
    pushButton = new QPushButton(mytest);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(70, 100, 75, 23));
    label = new QLabel(mytest);
    label->setObjectName(QString::fromUtf8("label"));
    label->setGeometry(QRect(183, 110, 111, 31));
    pushButton_2 = new QPushButton(mytest);
    pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
    pushButton_2->setGeometry(QRect(80, 200, 75, 23));
    retranslateUi(mytest);

    QMetaObject::connectSlotsByName(mytest);
    } // setupUi

    void retranslateUi(QWidget *mytest)
    {
    mytest->setWindowTitle(QApplication::translate("mytest", "Form", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("mytest", "PushButton", 0, QApplication::UnicodeUTF8));
    label->setText(QApplication::translate("mytest", "TextLabel", 0, QApplication::UnicodeUTF8));
    pushButton_2->setText(QApplication::translate("mytest", "PushButton", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(mytest);
    } // retranslateUi

    };

    namespace Ui {
    class mytest: public Ui_mytest {};
    } // namespace Ui

    #endif // UI_MYTEST_H

    看来答案已经差不多了。
    main.cpp 里面的这句话其实创建一个“画板”,好让你在上面画东西;
    QWidget *dlg = new QWidget();
    Ui::mytest ui;
    这句话的是定义名字空间namespace Ui 里面的一个类成员class mytest的一个对象 ui;
    要看到这个class mytest 是共有继承这个类的public Ui_mytest,而这个类class Ui_mytest却不是继承任何qt的类。所以setupUi()要用把画板的指针传进来,
    ui.setupUi(dlg);
    然后所有的控件的创建都是在这个画板上面进行的。
    最后我们show的时候就把dlg show出去。其实这个时候上面已经有我们画的东西(控件)了。
    给你一张白纸(dlg),画好你的东西,然后帖到画板上(setupUi),show的时候当然就是你画的东西啦!
    注意一个小细节,名字空间里面的类的名字怎么设置的?是在designer画ui的时候,右键菜单里面有个change objName,这里就是你改变
    namespace Ui {
    class mytest: public Ui_mytest {};
    }
    中的 class mytest的时候。

    休息一下!!
    对了,那些qt关键的槽在那里设置啊?这可是qt的卖点啊?

    那是因为我们给的画板太白了!它只是简单的一个widget,没有我们自己的槽,还是自己动手吧!
    因为我们自己的槽人家qt怎么知道是什么啊?
    mytest.h

    #include "ui_mytest.h"
    #include <qwidget.h>


    class mytest : public QWidget
    {
    Q_OBJECT//这个对于slots来说很重要,不要忘记了
    public:

    mytest();
    virtual ~mytest();


    public slots:
    void myslots();


    private :
    Ui::mytest ui;

    };

    各位看官注意了!这个class mytest 和 Ui::mytest 是不一样的,这里就体现了qt4 中designer的特点,她只是画Ui而已,其他的回归c++
    mytest.cpp

    #include "mytest.h"
    #include <qmessagebox.h>

    mytest::mytest()
    {
    ui.setupUi(this);//以后写构造函数第一件事就是写这个函数
    connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(myslots()));
    }

    mytest::~mytest()
    {

    }

    void mytest::myslots()
    {
    QMessageBox::information(this,"debug","myslots");
    }

    这里要注意的是connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(myslots()));
    中的ui.pushButton,而不是经常写的pushButton,这也是由于是在pushButton Ui里面的
    ,而不是在class mytest里面的。
    对应的main.cpp就变成了这个样子了。

    #include <qapplication.h>
    //#include "ui_mytest.h"

    #include "mytest.h"

    int main(int argc, char *argv[])
    {
    QApplication app(argc,argv);

    // QWidget *dlg = new QWidget();
    // Ui::mytest ui;
    // ui.setupUi(dlg);

    // dlg->show();


    mytest *dlg = new mytest();
    dlg->show(); 

    return app.exec();
    }

    一句话,到处都体现了qt4的设计思想,designer 只是画控件的工具。
    很久没有写东西了,语句不是很通顺,也是第一次写这样的东西,难免有错漏,请各位网友指正,共同进步。

    展开全文
  • QT UI特效

    千次阅读 2012-02-17 21:41:13
    使用Qt Style Sheets制作UI特效 ...在UI的制作方面Qt为广大开发者提供了一套强大而易用的工具,她就是——Qt Style Sheets。 UI涉及的东西非常庞杂,Qt Style Sheets也包含许许多多的内容,因此
    
    

    使用Qt Style Sheets制作UI特效

    引言

    作为一套GUI框架,Qt是非常强大的。(注:Qt 不仅是一套优秀的GUI框架,同时也是一套出色的应用程序框架)。
    在UI的制作方面Qt为广大开发者提供了一套强大而易用的工具,她就是——Qt Style Sheets。

    UI涉及的东西非常庞杂,Qt Style Sheets也包含许许多多的内容,因此本文并不试图对Qt Style Sheets进行系统的理论性的详解

    Style sheets 是由一系列的style rules组成的。一条style rule 由选择器selector和声明declaration这两部分构成。selector说明这条规则在哪些widgets上起作用,declaration说明要在这些widgets上设置什么属性properties。例如:

    QPushButton, QLineEdit  { color: red; background-color: white }

    在上面这条style rule中QPushButton, QLineEdit 是两个选择器,中间用逗号连接。 { color: red; background-color: white }是声明declaration,大括号里面是一系列的 property: value对,中间用分号连接。这条规则指出对QPushButton和QLineEdit 以及他们的子类需要使用红色作为其前景色,并使用白色作为其背景色。
    Qt widgets所支持的所有属性列表请查阅List of Properties


    Tab1:QLineEdit QGroupBox QRadioButton QCheckBox QLabel(使用qss文件)

    例子程序的UI结构非常简单,只有两部分,上方是一个有三个tab页面的QTabWidget,下面是一个QPushButton。
    下面我们先来制作TabWidget的第一个页面Tab1。先看一下效果图:
    图一:
    Tab1 1.jpg


    图二:
    Tab1 2.jpg


    这张是没有使用StyleSheet的样子:
    1.jpg


    Tab1中使用到了五种控件。如果控件较多或比较复杂,我们可以通过使用qss文件来设置Style Sheet。首先我们新建一个文本文档,后缀名改为qss,然后用文本编辑器比如记事本打开它,将我们设置的Style Sheets写进去然后保存就可以了。本例程创建的qss文件叫stylesheetDemo.qss,于是我们在程序中只需要写如下几行代码就可以使我们写在qss文件中的Style Sheets起作用:

    QFile file(":/qss/stylesheetDemo.qss");
    file.open(QFile::ReadOnly);
    QTextStream filetext(&file);
    QString stylesheet = filetext.readAll();
    ui->tab->setStyleSheet(stylesheet);

    程序中stylesheetDemo.qss已加入到资源文件,其中ui->tab就是TabWidget中的第一个tab页面。


    下面是stylesheetDemo.qss的内容:

    QGroupBox {
    	background-image: url(:/pics/background.png); 
    	border-radius: 30px;
    }
     
    QLabel {
    	color: gray;
    }
     
    QLineEdit {
    	background: qradialgradient(cx:0, cy:0, radius: 1,
                fx:0.5, fy:0.5, stop:0 white, stop:1 rgba(0,190,0, 60%));
    	border-radius: 9px;
    }
     
     
     
    QCheckBox:checked {
    	color: green;     
    }
     
    QCheckBox::indicator {
          width: 25px;
          height: 25px;
    }
     
    QCheckBox::indicator:checked {
         	image: url(:/pics/checkbox.gif);
    }
     
     
     
    QRadioButton{
          spacing: 10
    }
     
    QRadioButton::indicator {
          width: 25px;
          height: 25px;
    }
     
    QRadioButton:checked {
          color: rgb(230,115, 0);     
    }
     
    QRadioButton::indicator:checked {
          image: url(:/pics/radioButton.png);
    }

    其中border-radius指的是边框四角的半径,这一属性可以制作出弧形的边框。

    background-image属性设置控件的背景图片。
    background-color 设置控件的背景色,我们这里对QLineEdit使用了渐变的颜色,这里利用了Qt提供的qradialgradient
    一个冒号说明的是状态,例如“:checked”指的是当此控件被checked的时候。
    双冒号说明的是子控件,例如“::indicator”指的是 QCheckBox、QRadioButton、QAbstractItemView 或者是可以被选中的 QMenu item或QGroupBox的indicator。

    这里需要注意的是,由于QRadioButton和QCheckBox在Symbian上的实现有一点缺憾,就是他们在获得焦点的时候,其新的背景颜色会完全覆盖掉控件,用户就看不到控件了。因此我们需要去掉他们获得焦点的能力:

    ui->checkBox->setFocusPolicy(Qt::NoFocus);
    ui->checkBox_2->setFocusPolicy(Qt::NoFocus);
    ui->radioButton->setFocusPolicy(Qt::NoFocus);
    ui->radioButton_2->setFocusPolicy(Qt::NoFocus);

    Tab2:QTextBrowser (在代码中setStyleSheet)

    程序中对TextBrowser设置了一种透明的背景颜色,并且是像彩虹一样逐渐变化的颜色。这主要是利用了qlineargradient。下面分别是竖屏和横屏状态下Tab2的效果图:

    图三:

    Tab2 1.jpg


    图四:
    Tab2 2.jpg


    这张是没有使用StyleSheet的样子:
    2.jpg

    我们这里直接在代码中对textBrowser设置StyleSheet:

    ui->textBrowser->setStyleSheet("\
                color: rgb(127, 0, 63);\
                background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, \
                                    stop: 0 rgba(255, 0, 0, 30%), stop: 0.2 rgba(255, 128, 0, 30%), stop: 0.4 rgba(255, 255, 0, 30%), \
                                    stop: 0.6 rgba(0, 255, 0, 30%), stop: 0.8 rgba(0, 128, 255, 30%), stop: 1 rgba(128, 0, 255, 30%)); \
                selection-color: white;\
                selection-background-color: rgb(191, 31, 127);\
                border: 2px groove gray;\
                border-radius: 30px;\
                padding: 2px 4px;");


    Tab3:QWebView

    QWebView也是可以通过Qt Style Sheets的方式在一定程度上修改网页呈现在用户面前的样子。
    例程中对WebView设置了完全透明的背景色,下面是效果图:
    图五:
    Tab3 1.jpg


    图六:
    Tab3 2.jpg


    图七:
    Tab3 3.jpg


    这张是没有使用StyleSheet的样子:
    3.jpg

    ui->webView->setStyleSheet("border: 1px groove gray; border-radius: 5px; background-color: rgba(255, 193, 245, 0%); ");

    这里要注意,这样设置只对本身透明的网页是有效的,如果网页自己设置了白色背景,则我们还是看不到透明的效果。

    还要额外说明一点,如果不对webView的border属性进行设置,而使用QWebView在N8上的默认实现,则网页中的Button是黑色的背景,Button上的字是看不清的。
    要想完全使网页按照我们自定义的样式进行显示(渲染),最根本的解决办法是我们修改Webkit,从而渲染出我们需要的样子。

    QPushButton QTabWidget

    对比图一和图二,我们会发现exit按钮按下和没有按下时的背景、文字颜色和文字位置都是不一样的,其中背景是通过border-image实现的,文字的位置是通过padding来控制的。

    ui->ExitpushButton->setStyleSheet("\
                                          QPushButton {\
                                                color: white;\
                                                border-image: url(:/pics/button.png);\
                                                border-width: 12px;\
                                                padding: -12px 0px;\
                                                min-height: 25px;\
                                                min-width: 60px;\
                                                }\
                                          QPushButton:pressed {\
                                                color: lightgray;\
                                                border-image: url(:/pics/button-pressed.png); \
                                                padding-top: -10px;\
                                                padding-bottom: -16px;\
                                                }\
                                          ");


    对于三个tab标签的样式是这样设置的,其中!selected表示没有选中,margin-top: 5px;会使得选中的tab比没选中的高5个像素。

    ui->tabWidget->setStyleSheet("\
                                     QTabBar::tab {\
                                            color: rgb(84,2,119);\
                                            background-image: url(:/pics/wood.jpg); \
                                            border: 2px solid rgb(68,66,64);\
                                            border-bottom-color: rgb(68,66,64); \
                                            border-top-left-radius: 20px;\
                                            border-top-right-radius: 20px;\
                                            max-height: 21px;\
                                            min-width: 8ex;\
                                            padding: 2px;\
                                            } \
                                      QTabWidget::tab-bar {\
                                            alignment: center;\
                                            } \
                                      QTabBar::tab:!selected {\
                                            margin-top: 5px; \
                                            }\
                                      QTabBar::tab:selected {\
                                            color: rgb(255,0,128); \
                                            }\
                                      ");

    最后横竖屏背景图片的切换也是通过stylesheet实现的:

    void MainWindow::resizeEvent ( QResizeEvent * event )
    {
        enum ScreenMode currentscreenMode;
        if(size().height()> size().width())
            currentscreenMode = Portrait;
        else
            currentscreenMode = Landscape;
     
        if (currentscreenMode!=scmode)
        {
            scmode = currentscreenMode;
            switch(scmode)
            {
            case Portrait:
                this->setStyleSheet("QMainWindow{ background-image: url(:/pics/bgPortrait.jpg)}");
                break;
            case Landscape:
                this->setStyleSheet("QMainWindow{ background-image: url(:/pics/bgLandscape.jpg)}");
                break;
            default:
                break;
            }
        }
    }

    展开全文
  • Qt UI界面改了,但UI界面不更新

    千次阅读 2015-10-21 16:09:00
    /****************************************... * Qt UI界面改了,但UI界面不更新 * 声明: * 有时候我们会直接拿别人的Qt项目过来参考修改,但是有时候会遇到UI界面 * 修改了,但是程序运行的时候总是原来的UI...
  • QT UI文件生成头文件

    千次阅读 2017-08-01 22:16:48
    1,将设计的UI文件拷贝到uic.exe的目录下Qt\Qt5.3.2\5.3\mingw482_32\bin. 2, 打开windows的CMD,进入到UIC的目录下:cd C:\Qt\Qt5.3.2\5.3\mingw482_32\bin 3, 执行如下命令:uic mainwindow.ui -o
  • qt ui界面设计

    千次阅读 2018-04-09 09:15:49
    如何用代码操作ui上的控件,使用ui-&gt;button类型方式,可以操作.mainwindow是属于带菜单栏的文件类型.在进行菜单栏的编辑时,可以直接在ui上进行添加修改,十分方便,还可以使用信号与槽,添加某些动作.stactwidget ...
  • QT ui界面设置总结

    千次阅读 2017-08-15 10:49:44
    ui->widget->setStyleSheet(“border-radius:3px;”); 创建托盘图标: 复制代码 //加在ico图标 QIcon icon = QIcon(“:/icofire.ico”); setWindowIcon(icon); //创建 trayIcon = new QSystemTrayI
  • Qt ui不更新问题

    千次阅读 2019-01-19 00:13:42
    Qt Creator左侧的项目中找到编译输出目录,如图所示 根据得到的目录打开相应的文件夹,从文件夹中找到需要更新的UI编译文件,形如ui_uixxxxx.h. 复制该文件到源码所在目录,覆盖同名的.h文件 运行程序,...
  • QtUI界面美化

    千次阅读 2019-01-30 16:46:59
    在属性编辑器中设置stylesheet来修改界面 1.QRadioButton QRadioButton{ spacing: 5px; } QRadioButton::indicator{ width: 45px; height: 30px; } QRadioButton::indicator:unchecked{ ...
  • QT UI美化 布局

    千次阅读 2015-06-02 13:40:50
    Qt::CustomizeWindowHint | Qt::WindowTitleHint 用法一: clientMainWindow::clientMainWindow(QWidget *parent) :  QMainWindow(parent, Qt::WindowCloseButtonHint) {  ... } 用法...
  • QT UI界面卡死解决方案

    千次阅读 2019-06-29 10:09:19
    QTUI界面经常出现你添加了相关的控件,但是在程序中不能调用,或者编译了发现UI界面没有改变,这个时候,可以用一下2个方法解决: 1.使用QT安装的时候安装的 QT5.4 for Desktop ,使用 cd命令跳转到程序存放文件夹...
  • 相信很多小伙伴在使用Qt Widget的过程中都会遇到一个问题,开发出来的界面,丑!丑!丑!当然Qt做界面美化可以用到QSS,需要对前端知识有一定了解,后续本套教程将会做讲解。 本篇文章,我们直接站在巨人(大佬飞扬...
  • QT UI界面组件介绍

    千次阅读 2020-03-10 23:46:37
    1.布局类(4种) 2.固定弹簧类(2种)(不随布局变化) 3.按钮类(6种) 4.容器类(10种) Th1: Group Box类似于win7的日历框 Th3: Tool Box类似于QQ的好友列表 Th4: Tab widget类似于 ...
  • Qt Ui 头文件研究

    千次阅读 2012-09-03 21:33:47
    用最新的QtCreator选择GUI的应用会产生含有如下文件的工程   下面就简单分析下各部分的功能。   .pro文件是供qmake使用的文件,不是本文的重点【不过其实也很简单的】,在此不多赘述。 所以呢,还是从...
  • QT UI的几种布局

    千次阅读 2018-03-07 15:13:23
    可以选中要联合布局的几个单独的控件进行横向或垂直方向布局横向布局如下: 垂直布局如下: 也可使用栅格布局对所有控件进行布局上面的几种布局方式运行后,器件不随窗体大小改变而改变,可以对窗体进行栅格......
  • QT UI显示中文的三种方法

    万次阅读 2017-08-02 20:01:40
    QT 显示中文的三种方法
  • 当我们用别人的Ui文件时候,自己新建的类要像下面的样子。 Wndblh2xyz.h文件如下 namespace Ui { class Wndblh2xyz; } class Wndblh2xyz : public QWidget { Q_OBJECT public: Wndblh2xyz(QWidget *parent = 0); ...
  • 最近, 想实现这样一个功能, 利用Qt做了一个播放器, 带UI界面, 为了方便, 希望能将这个Qt 窗体 直接嵌入到C# Winform中使用, 但不知道如何才能实现所谓的"嵌入"? 在网上查了一下, 说是要做成ocx或com组件, 然后在C#....
  • Qt ui->setupUi(this)的作用

    千次阅读 2019-01-22 20:03:32
    ui-&gt;setupUi(this)的作用 ui-&gt;setupUi(this);...// 它按照Qt设计器里设计的样子把窗体画出来,把Qt设计器里面定义的信号和槽建立起来。 // 也可以说,setupUi是界面和写程序之间的桥梁。...
  • Qt ui在程序中的使用方式

    千次阅读 2013-11-17 22:13:34
    Qt 通过Qt designer 可以生成ui文件,在使用时可利用Qt自带的uic工具生成ui.xxx.h文件进行使用。 利用Designer设计生成的ui有三种使用方式 1.直接使用法 QWidget *w = new QWidget; Ui::Small s; s.setupUi(w); w....
  • 修改QTui界面

    2013-05-09 17:07:04
    同学发过来的程序要我帮他改ui界面 我需要添加按钮与功能 但是我总改不了他的ui界面 是怎莫回事 运行后仍然是原来的界面 那位大师帮帮忙 新手学QT 懂得很少 这个问题困扰好几天了 我是在winsowns下运行的
  • 解决QT Ui 修改后不能生效的问题

    千次阅读 2019-04-15 23:44:40
    进入 win7安装QT的bin目录 cd C:\Qt\Qt5.6.2\5.6\mingw49_32\bin uic /.../.../xxx.ui -o ui_xxx.h
  • QML代码与现有Qt UI代码整合

    万次阅读 2012-09-02 12:50:39
    有很多方式可将QML整合到基于QWidget UI应用程序中,具体方案依赖于UI代码的特征. 与基于QWidget的UI整合 如果有一个基于QWidge的UI界面,可使用QDeclarativeView整合QML部件.QDeclarativeView继承于QWidget,因此...
  • 设置Qt ui文件编译路径

    千次阅读 2012-09-14 14:25:16
    vs2005下默认的编译ui文件的生成路径为:".\GeneratedFiles\ui_$(InputName).h",可修改此路径将编译后生成的c++文件保存在需要的目录。 方法:点击打开ui文件的属性,弹出 属性对话框,修改“输出” 属性
  • QT UI更改后运行无变化

    千次阅读 2016-03-19 18:09:44
    其实就是工程目录下的文件没及时更新 1.找到project构建的目录,复制ui_XX.h 2.找到.pro的目录(工程文件存放处),覆盖ui_XX.h 3.运行 OK。。
  • Qt ui 界面QLabel及QLineEdit几种操作

    千次阅读 2019-08-03 18:25:25
    #include "widget.h" #include "ui_widget.h" #include <QStringList> #include <QCompleter> #include <QMovie> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widg...
  • GitHub开源推荐 | 一个轻量级Qt UI

    千次阅读 2020-12-05 23:27:40
    分享一个轻量级 Qt UI 库 - Skinny,可以在 C++/QML 中使用。 地址:https://github.com/uwerat/qskinny Star:300+ 这个库基于 Qt 图形视图,有少量的核心类来自 Qt/Quick。 1 样式效果 Skinny 附带了大量的示例...
  • QtUI设计:设置控件透明

    千次阅读 2016-05-27 11:07:39
    QT设置按钮控件透明:  代码: //设置按钮 背景 前景 this->ui->ShowCvRGB->setStyleSheet(QString("color:rgba(255,255,255,255);background-color:rgba(100,100,100,100)")); // 第一个 为前景色;第二个 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,658
精华内容 32,663
关键字:

qtui