精华内容
下载资源
问答
  • 非模式对话框则允许用户在该对话框和应用程序其他窗口之间切换。创建区别:相同点 都是要首先建立对话框类完成话框功能然后再调用。不同点 调用方式不同 模式对话框 使用Domodal函数来创建窗口。例如:...

    非模式对话框与模式对话框

    使用区别:

    模式对话框不允许用户在对话框关闭之前操作应用程序的其他窗口。

    非模式对话框则允许用户在该对话框和应用程序其他窗口之间切换。

    创建区别:

    相同点 都是要首先建立对话框类完成话框的功能然后再调用。

    不同点 调用方式不同

     

    模式对话框 使用Domodal函数来创建窗口。

    例如:

    CModeDialog ModeDlg;

    ModeDlg.DoModal();

     

    窗口关闭则销毁了对话框。

    非模式对话框使用create函数来创建。

    例如:

    声明 CPointInfo *m_pPointInfo;

     

    构造函数中初始化

    m_pPointInfo == NULL

    创建窗口

    if(m_pPointInfo != NULL)

     {

          m_pPointInfo->Create(IDD_MOUSE_POINT_DIALOG,this);

          m_pPointInfo->ShowWindow(SW_SHOW);

     }

    注意: 因为用户可以在非模式窗口和模式窗口之间切换就有可能主窗口关掉而子窗口没关掉。所以在主窗口的析构函数中应该把子窗口删掉。

     

    if(m_pPointInfo != NULL)

         {

             m_pPointInfo->DestroyWindow();

             delete m_pPointInfo;

         }

    展开全文
  • 按下ALT+ENTER键,然后这个时候就是窗口模式了,然后你再左上角"控制按钮",然后会弹出一个菜单,你就选择"属性",这个时候就会弹出一个对话框选择"选项"这个选项卡,你会看到有一个"显示选项"里面有"窗口""全屏显示...
    运行VC++的时候那个窗口是全屏的话,按下ALT+ENTER键,然后这个时候就是窗口模式了,然后你再点左上角的"控制按钮",然后会弹出一个菜单,你就选择"属性",这个时候就会弹出一个对话框选择"选项"这个选项卡,你会看到有一个"显示选项"里面有"窗口"和"全屏显示"你选择"窗口",然后点确定,这个时候它会问你是一直保存吗?还是当前保存,你就选择第二个"保存属性,供以后具有相同标题的窗口使用."然后再点确定
    展开全文
  • XY图窗口及属性对话框与波形图窗口及属性对话框相同,具体设置可以参照波形图中介绍。XY图窗口完整显示项属性对话框如图1所示。  XY图接收数据不要求水平坐标等间隔分布,而且数据格式波形图也有一些区别...
  • LabVIEWXY图窗□

    2021-01-19 23:06:39
    XY图窗口及属性对话框与波形图窗口及属性对话框相同,具体设置可以参照波形图中介绍。XY图窗口完整显示项属性对话框如图1所示。  XY图接收数据不要求水平坐标等间隔分布,而且数据格式波形图也有一些区别...
  • 这样虽然解决了上面主窗口一闪而过问题,但是,如果在my1 对话框出现时 候不enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但 是事实是这样吗?如果你此时对程序进行了改动,再次按下run ...
  • LabVIEW强度图表

    2021-01-19 23:06:47
     图1 强度图表窗口及属性对话框 强度图表强度图之间差别与波形图中相似:强度图性接收所有需要显示数据,并全部显示在图形窗口中,不能保存历史数据;强度图表可以逐地显示数据,反映数据变化趋势,...
  •  图1 强度图表窗口及属性对话框 强度图表强度图之间差别与波形图中相似:强度图一次性接收所有需要显示数据,并全部显示在图形窗口中,不能保存历史数据;强度图表可以逐地显示数据,反映数据变化趋势...
  • 1.如果用户使用1验证,那么他将被分配一个令牌ID,我们将绑定下拉列表,这个列表在gmail撰写窗口中是可见。 2.如果用户不是1point认证用户,那么他将在gmail撰写窗口中获得注册按钮。 支持语言:English,...
  • Qt 之 自定义提示信息框—迅雷风格

    千次阅读 2016-12-13 22:25:24
    一、简述最近一直在研究迅雷9界面,花了时间做了几个通用提示信息框,整体风格与迅雷9界面相同。支持模态非模态两种模式窗口。提示框效果见下图。我们可以根据设置不同参数来设置提示框标题、显示内容、...

    一、简述

    最近一直在研究迅雷9的界面,花了点时间做了几个通用的提示信息框,整体风格与迅雷9界面相同。支持模态和非模态两种模式窗口。提示框效果见下图。

    这里写图片描述

    我们可以根据设置不同的参数来设置提示框标题、显示内容、显示图标、下方按钮个数,可以设置为输入框,也可以设置为模态/非模态对话框,实现了自定义的QMessageBox。目前实现了提示框基本功能,后续将继续拓展更多功能。小伙伴们可以根据需要自定义其他功能,下面直接上代码。

    后续更改了一下样式,修改为QQ风格的提示窗口,详情见 Qt 之 自定义提示信息框—QQ风格

    这里写图片描述

    二、代码之路

    看代码之前需要看一下Qt 之 自定义窗口标题栏这一篇文章,因为这里用到了这篇文章中写到的自定义标题栏。

    如果需要了解如何实现窗口的模态与非模态对话框可以看一下 Qt 之 模态与非模态窗口的介绍及 实现QDialog的exec()方法 这一篇文章。

    这里新建任务窗口类MyMessageBox 继承了BaseWindow类,所以省去了一些代码实现(主要包括顶部标题栏、鼠标按住标题栏进行拖动,窗口背景色等 ),有需要的小伙伴可以去看一下这一篇文章。

    mymessagebox.h

    #include <QWidget>
    #include "ui_mymessagebox.h"
    #include "basewindow.h"
    
    enum ChosseResult
    {
        ID_OK = 0,                      // 确定;
        ID_CANCEL                       // 取消;
    };
    
    enum MessageType
    {
        MESSAGE_INFORMATION = 0,        // 提示信息;
        MESSAGE_WARNNING,               // 提示警告;
        MESSAGE_QUESTION,               // 提示询问;
        MESSAGE_INPUT                   // 提示输入框;
    };
    
    enum MessageButtonType
    {
        BUTTON_OK = 0,                  // 只有确定按钮;
        BUTTON_OK_AND_CANCEL,           // 确定、取消按钮;
        BUTTON_CLOSE                    // 关闭按钮;
    };
    
    class MyMessageBox : public BaseWindow
    {
        Q_OBJECT
    
    public:
        MyMessageBox(QWidget *parent = 0);
        ~MyMessageBox();
    
        void setWindowTitle(QString title, int titleFontSize = 10);
        void setContentText(QString contentText);
        void setMessageType(MessageType messageType);
        void setButtonType(MessageButtonType buttonType);
        void setMessageContent(QString messageContent);
    
    public:
        int static showMyMessageBox(QWidget* parent, const QString &title,const QString &contentText , MessageType messageType, MessageButtonType messageButtonType , bool isModelWindow = false);
    
    
    private:
        void initWindow();
        void initTitleBar();
        int exec();
    
        void paintEvent(QPaintEvent *event);
        void closeEvent(QCloseEvent *event);
    
    private slots:
        void onOkClicked();
        void onCancelClicked();
    
    private:
        Ui::MyMessageBox ui;
        QEventLoop* m_eventLoop;
        ChosseResult m_chooseResult;
    };

    mymessagebox.cpp

    #include "mymessagebox.h"
    #include <QPainter>
    #include <QCloseEvent>
    
    MyMessageBox::MyMessageBox(QWidget *parent)
        : BaseWindow(parent)
        , m_eventLoop(NULL)
        , m_chooseResult(ID_CANCEL)
    {
        ui.setupUi(this);
        initWindow();
    }
    
    MyMessageBox::~MyMessageBox()
    {
    
    }
    
    void MyMessageBox::initWindow()
    {
        initTitleBar();
        loadStyleSheet("MyMessageBox/MyMessageBox");
        Qt::WindowFlags flags = this->windowFlags();
        this->setWindowFlags(flags | Qt::Window);
    
        ui.inputContent->setVisible(false);
    
        connect(ui.pButtonOk, SIGNAL(clicked()), this, SLOT(onOkClicked()));
        connect(ui.pButtonCancel, SIGNAL(clicked()), this, SLOT(onCancelClicked()));
    }
    
    // 初始化标题栏;
    void MyMessageBox::initTitleBar()
    {
        m_titleBar->move(1, 2);
        m_titleBar->setWindowBorderWidth(2);
        m_titleBar->setBackgroundColor(255, 255, 255);
        m_titleBar->setButtonType(ONLY_CLOSE_BUTTON);
        m_titleBar->setTitleWidth(this->width());
    }
    
    void MyMessageBox::paintEvent(QPaintEvent *event)
    {
        // 绘制窗口白色背景色;
        QPainter painter(this);
        QPainterPath pathBack;
        pathBack.setFillRule(Qt::WindingFill);
        pathBack.addRect(QRect(0, 0, this->width(), this->height()));
        painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
        painter.fillPath(pathBack, QBrush(QColor(255, 255, 255)));
    
        // 绘制按钮部分灰色背景;
        QPainterPath pathButtonBack;
        pathButtonBack.setFillRule(Qt::WindingFill);
        pathButtonBack.addRect(QRect(0, 110, this->width(), 48));
        painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
        painter.fillPath(pathButtonBack, QBrush(QColor(247, 247, 247)));
    
        // 绘制窗口灰色边框;
        QPen pen(QColor(204, 204, 204));
        painter.setPen(pen);
        painter.drawRect(0, 0, this->width() - 1, this->height() - 1);
    
        // 绘制窗口上方蓝条;
        QPainterPath pathHead;
        pathHead.setFillRule(Qt::WindingFill);
        pathHead.addRect(QRect(0, 0, this->width(), 2));
        painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
        painter.fillPath(pathHead, QBrush(QColor(15, 151, 255)));
    
        return QWidget::paintEvent(event);
    }
    
    void MyMessageBox::setWindowTitle(QString title , int titleFontSize)
    {
        m_titleBar->setTitleContent(title, titleFontSize);
    }
    
    void MyMessageBox::setContentText(QString contentText)
    {
        ui.MessageContent->setText(contentText);
    }
    
    void MyMessageBox::setMessageType(MessageType messageType)
    {
        switch (messageType)
        {
        case MESSAGE_INFORMATION:
            ui.MessageIcon->setPixmap(QPixmap(":/Resources/MyMessageBox/information.png"));
            break;
        case MESSAGE_WARNNING:
            ui.MessageIcon->setPixmap(QPixmap(":/Resources/MyMessageBox/warnning.png"));
            break;
        case MESSAGE_QUESTION:
            ui.MessageIcon->setPixmap(QPixmap(":/Resources/MyMessageBox/question.png"));
            break;
        case MESSAGE_INPUT:
            ui.MessageIcon->setVisible(false);
            ui.inputContent->setVisible(true);
        default:
            break;
        }
    }
    
    void MyMessageBox::setButtonType(MessageButtonType buttonType)
    {
        switch (buttonType)
        {
        case BUTTON_OK:
        {
            ui.pButtonOk->setText(QStringLiteral("确定"));
            ui.pButtonCancel->setVisible(false);
        }
            break;
        case BUTTON_OK_AND_CANCEL:
        {
            ui.pButtonOk->setText(QStringLiteral("确定"));
            ui.pButtonCancel->setText(QStringLiteral("取消"));
        }
            break;
        default:
            break;
        }
    }
    
    void MyMessageBox::setMessageContent(QString messageContent)
    {
        ui.MessageContent->setText(messageContent);
    }
    
    // 显示提示框
    // isModelWindow 参数设置提示框是否是模态
    int MyMessageBox::showMyMessageBox(QWidget* parent, const QString &title, const QString &contentText, MessageType messageType, MessageButtonType messageButtonType, bool isModelWindow)
    {
        MyMessageBox * myMessageBox = new MyMessageBox(parent);
        myMessageBox->setWindowTitle(title);
        myMessageBox->setContentText(contentText);
        myMessageBox->setMessageType(messageType);
        myMessageBox->setButtonType(messageButtonType);
        if (isModelWindow)
        {
            // 设置为模态窗口时,参数parent必须设置父窗口指针,否则模态设置无效;
            // 因为 Qt::WindowModal 参数只对父窗口有效,如果想要模态对全局窗口都有效可以设置 Qt::ApplicationModal
            return myMessageBox->exec();
        }
        else
        {
            myMessageBox->show();
        }
    
        return 0;
    }
    
    int MyMessageBox::exec()
    {
        // 因为QWidget没有exec()方法,所以需要自己定义来完成exec()方法;
        // 而exec()方法就是直接设置窗口显示为模态,并且窗口关闭结束后返回用户选择结果(按了确定还是取消按钮);
        // 而show()方法只是显示窗口,并不会设置窗口的模态或者非模态,需要自己调用setWindowModality()方法进行设置;
        // 而且show()方法并不会返回用户选择结果;
        // 这里也可以继承QDialog类,QDialog有自己的exec()方法,根据返回 Accepted, Rejected来决定是否按了确定按钮;
    
        // 设置为窗口级模态,也可设置为应用程序及模态 Qt::ApplicationModal;
        this->setWindowModality(Qt::WindowModal); 
        show();
        // 使用事件循环QEventLoop ,不让exec()方法结束,在用户选择确定或者取消后,关闭窗口结束事件循环,并返回最后用户选择的结果;
        // 根据返回结果得到用户按下了确定还是取消,采取相应的操作。从而模拟出QDialog类的exec()方法;
        m_eventLoop = new QEventLoop(this);
        m_eventLoop->exec();
    
        return m_chooseResult;
    }
    
    void MyMessageBox::onOkClicked()
    {
        m_chooseResult = ID_OK;
        close();
    }
    
    void MyMessageBox::onCancelClicked()
    {
        m_chooseResult = ID_CANCEL;
        close();
    }
    
    void MyMessageBox::closeEvent(QCloseEvent *event)
    {
        // 关闭窗口时结束事件循环,在exec()方法中返回选择结果;
        if (m_eventLoop != NULL)
        {
            m_eventLoop->exit();
        }
        event->accept();
    }

    样式

    *{font-family:Microsoft YaHei;}
    
    QLabel#MessageContent
    {
        font-size:14px;
    }
    
    QPushButton#pButtonOk
    {
        color:white;
        background-color:rgb(14 , 150 , 254);
        border: 1px solid rgb(11 , 137 , 234);
    }
    
    QPushButton#pButtonOk:hover
    {
        color:white;
        background-color:rgb(44 , 137 , 255);
        border: 1px solid rgb(11 , 137 , 234);
    }
    
    QPushButton#pButtonOk:pressed
    {
        color:white;
        background-color:rgb(14 , 135 , 228);
        border: 1px solid rgb(12 , 138 , 235);
        padding-left:3px;
        padding-top:3px;
    }
    
    QPushButton#pButtonCancel
    {
        color:black;
        background-color:rgb(238 , 238 , 238);
        border: 1px solid rgb(183 , 183 , 183);
    }
    
    QPushButton#pButtonCancel:hover
    {
        color:black;
        background-color:rgb(228 , 240 , 250);
        border: 1px solid rgb(15 , 150 , 255);
    }
    
    QPushButton#pButtonCancel:pressed
    {
        color:black;
        background-color:rgb(204 , 228 , 247);
        border: 1px solid rgb(1 , 84 , 153);
        padding-left:3px;
        padding-top:3px;
    }
    
    QLineEdit#inputContent
    {
        border: 1px solid rgb(195 , 195 , 195);
    }
    
    QLineEdit#inputContent:hover
    {
        border: 1px solid rgb(1 , 186 , 255 );
    }

    测试代码

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MyMessageBox::showMyMessageBox(NULL, QStringLiteral("删除"), QStringLiteral("您确定要删除此任务吗?"), MESSAGE_WARNNING, BUTTON_OK_AND_CANCEL);
    
        MyMessageBox::showMyMessageBox(NULL, QStringLiteral("退出"), QStringLiteral("任务为下载完,确定退出吗?"), MESSAGE_QUESTION, BUTTON_OK_AND_CANCEL);
    
        MyMessageBox::showMyMessageBox(NULL, QStringLiteral("提示"), QStringLiteral("您输入的用户名不正确"), MESSAGE_INFORMATION, BUTTON_OK_AND_CANCEL);
    
        MyMessageBox::showMyMessageBox(NULL, QStringLiteral("重命名"), QStringLiteral("文件名: "), MESSAGE_INPUT, BUTTON_OK_AND_CANCEL);
        return a.exec();
    }

    界面设计

    这里写图片描述


    运行结果图:

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    模态窗口测试效果

    这里写图片描述


    代码其实很简单,这里只是实现了基本功能(根据参数设置不同样式的提示框),更多可以参考Qt的QMessageBox,在后续会增加更多功能实现,敬请期待哈 O(∩_∩)O !


    更多文章

    Qt 之 自定义提示信息框—QQ风格

    Qt 之 模态与非模态窗口的介绍及 实现QDialog的exec()方法

    Qt 之 自定义窗口标题栏

    代码下载

    Qt 之 自定义提示信息框—QQ、迅雷风格 (包含了QQ和迅雷两种风格的提示框)

    展开全文
  • Qt Jambi入门  本节,我们将开发一个...通过使用相同例子,可以更容易地看出C++/QtQt Jambi编程中不同点和相同点。在讲解代码同时,我们也会介绍出现C++Java概念上区别。 图C.1 Jambi Find对话

    Qt Jambi入门

          本节,我们将开发一个简单的Java应用程序并显示如图C.1所示的窗口。除窗口标题之外,Jambi Find对话框与第二章中创建的Find对话框的外观和功能均相同。通过使用相同的例子,可以更容易地看出C++/Qt和Qt Jambi编程中的不同点和相同点。在讲解代码的同时,我们也会介绍出现的C++和Java概念上的区别。


    图C.1 Jambi Find对话框

          Jambi Find程序的实现代码在一个单独的文件中,文件名为FindDialog.java。我们将分片介绍文件内容,首先从import声明开始。

    import com.trolltech.qt.core.*;

    import com.trolltech.qt.gui.*;

          这两个import声明将Qt所有的核心类和GUI类都引入了Java。其他的类集可以通过相同的import声明引入(如import com.trolltech.qt.opengl.*)。

    public class FindDialog extends QDialog {

          与C++版本的例子相同,FindDialog类是QDialog的一个子类。在C++中,信号要在头文件里声明,依靠moc工具生成支撑代码。在Qt Jambi中,用Java的内省技术实现信号槽机制。但我们仍需要一些声明信号的方法,这可以使用SignalN类实现:

    public Signal2<String,Qt.CaseSensitivity> findNext = new Signal2<String,Qt.CaseSensitivity>();

    public Signal2<String,Qt.CaseSensitivity> findPrevious = new Signal2<String, Qt.CaseSensitivity>();

          共有10个SignalN类——Signal0、Signal1<T1>……Signal9<T1……T9>。类名中的数字表明了它们接受多少个参数,类型T1……T9指定了参数类型。这里,我们声明了两个信号,每个信号包含两个参数。两个信号的第一个参数是Java String类型,第二个参数是Qt.CaseSensitivity类型(这是一个Java的枚举类型)。在Qt API中的所有QString,在Qt Jambi中均用String替代。

          与其他的SignalN类不同,Signal0不是一个泛型类。要使用Signal0创建一个不含参数的信号,可以像下面这样:

    public Signal0 somethingHappened = newSignal0();

          信号创建完成后,我们来看构造函数的实现。函数太长,我们将其分成三部分讲解。

    public FindDialog(QWidget parent) {

           super(parent); 

    label = new QLabel(tr("Find &what:"));

    lineEdit = new QLineEdit();

    label.setBuddy(lineEdit); 

    caseCheckBox = new QCheckBox(tr("Match&case"));

    backwardCheckBox = newQCheckBox(tr("Search &backward")); 

    findButton = newQPushButton(tr("&Find"));

    findButton.setDefault(true);

    findButton.setEnabled(false); 

    closeButton = newQPushButton(tr("Close"));

          在Java中创建窗口部件与C++唯一不同的是细微的语法细节。要注意的是,tr()的返回值是String类型,而不是QString。

    lineEdit.textChanged.connect(this,"enableFindButton(String)");

    findButton.clicked.connect(this,"findClicked()");

    closeButton.clicked.connect(this,"reject()");

          Qt Jambi连接信号槽的语法与C++/Qt有点不同,但依然很简短。通常语法如下:

    sender.signalName.connect(receiver,"slotName(T1, ..., TN)");

          与C++/Qt不同,我们不需要给信号指定签名。如果信号包含的参数多于它所连接的槽函数,那这些多出来的函数会被忽略。此外,在Qt Jambi中,信号槽机制不止限于在QObject子类中应用,任何继承QSignalEmitter的类都可以发出信号,任何类的任何函数都可以作为槽函数。

    QHBoxLayout topLeftLayout = newQHBoxLayout();

    topLeftLayout.addWidget(label);

    topLeftLayout.addWidget(lineEdit); 

    QVBoxLayout leftLayout = new QVBoxLayout();

    leftLayout.addLayout(topLeftLayout);

    leftLayout.addWidget(caseCheckBox);

    leftLayout.addWidget(backwardCheckBox);

    QVBoxLayout rightLayout = new QVBoxLayout();

    rightLayout.addWidget(findButton);

    rightLayout.addWidget(closeButton);

    rightLayout.addStretch(); 

    QHBoxLayout mainLayout = new QHBoxLayout();

    mainLayout.addLayout(leftLayout);

    mainLayout.addLayout(rightLayout);

    setLayout(mainLayout); 

    setWindowTitle(tr("Jambi Find"));

    setFixedHeight(sizeHint().height());

    }

          窗口布局代码实际上与原始的C++代码完全一样,用相同的布局类以完全相同的方式实现相同的功能。Qt Jambi中也可以通过Qt Designer以窗体形式创建对话框,然后用juic(Java用户接口编译器)编译,我们将在下节讲解这种方法。

    private void findClicked() {

       String text = lineEdit.text();

       Qt.CaseSensitivity cs = caseCheckBox.isChecked()

               ? Qt.CaseSensitivity.CaseSensitive

               : Qt.CaseSensitivity.CaseInsensitive;

        if(backwardCheckBox.isChecked()) {

          findPrevious.emit(text, cs);

        }else {

          findNext.emit(text, cs);

        }

    }

          Java关于枚举值的语法比C++稍微复杂点,但很容易理解。调用SignalN对象的emit()函数并传递正确类型的参数即可触发信号。类型检查在程序编译过程中完成。

    private void enableFindButton(String text) {

    findButton.setEnabled(text.length() != 0);

    }

          enableFindButton()函数的功能和使用与C++源码相同。

    private QLabel label;

    private QLineEdit lineEdit;

    private QCheckBox caseCheckBox;

    private QCheckBox backwardCheckBox;

    private QPushButton findButton;

    private QPushButton closeButton;

          为了保持与本书其他部分代码的一致,我们将所有的窗口部件声明为类的私有成员。这仅仅是风格的问题,没什么可以阻止我们在构造函数中声明那些只在构造函数中用到的部件。比如,我们可以在构造函数中声明label和closeButton,因为没有其他地方引用它们。构造函数结束时也无需回收它们占用的资源。这是因为Qt Jambi使用与C++/Qt相同的父子类关系机制,所以一旦label和closeButton被创建出来,FindDialog窗口就获得了它们的所有权,并在内部保留其引用来保证它们的生命周期。QtJambi递归删除子窗口部件,一旦最顶层的窗口被删除,该窗口会反过来删除它所有的子部件和布局,这些子部件和布局又删除它们的子部件和布局,依次类推,直至清除完毕。

    使用Java资源系统

          与大多数Java标准类不同,Qt Jambi深度支持Java的资源系统。Java资源由classpath:前缀定义。在Qt Jambi API中任何地方用到的文件名都可以用指定的Java资源代替,比如:

    QIcon icon = new QIcon("classpath:/images/icon.png");

    if (!icon.isNull()) {

        ...

    }

          为找到需要的图标,Qt Jambi会搜索每个目录下的每个image文件夹或搜索由CLASSPATH环境变量指定的.jar文件。一旦找到icon.png图标文件,即结束搜索并使用所找到的文件。

          如果指定的文件不存在,程序也不会报错。在上面的例子中,如果没有找到icon.png,icon.isNull()会返回true。像QImage和QPixmap这种有构造函数的类,其构造函数包含一个文件名参数,我们可以使用isNull()函数检测指定的文件读取是否成功。在QFile中,我们用QFile.error()检查文件是否被读取。

          与AWT、SWing、SWT不同,Qt Jambi充分利用Java的碎片资源回收功能,如果删除了最顶层窗口的最后一个引用,系统会自动安排对这个窗口碎片资源的回收,而不需要显式的调用dispose()。这种方式非常方便,工作机制与C++/Qt相同。需要重点提醒的是,对于SDI(单文档界面)程序,必须保留所创建的每个顶层窗口的引用,以免它们被回收(在C++/Qt中,SDI程序通常使用Qt::WA_DeleteOnClose属性防止内存泄漏)。

    public static void main(String[] args) {

           QApplication.initialize(args);

           FindDialog dialog = new FindDialog(null);

           dialog.show();

           QApplication.exec();

        }

    }

          为方便起见,我们所提供的FindDialog带有main()函数,main()函数实例化了一个对话框并将其显示出来。声明行importcom.trolltech.qt.gui.*确保了我们可以使用静态的QApplication对象。Qt Jambi程序开始时,必须调用QApplication.initialize()并将命令行参数传递进去。QApplication对象可以处理它支持的参数,比如-font和-style。

          创建FindDialog时,将null作为父类传递进去表示所创建的对话框是顶层窗口。一旦main()函数结束,对话框即会消失,其资源也会被回收。调用QApplication.exec()开始事件循环,只有用户关闭对话框时,事件循环才会将控制权返还给mian()函数。

          虽然Qt Jambi API与C++/Qt API很相似,但仍有区别。比如,在C++中,QWidget::mapTo()成员函数有如下定义:

    QPoint mapTo(QWidget *widget, const QPoint&point) const;

         其中QWidget作为变量指针传递,但QPoint却是常量引用。在Qt Jambi中,等效的函数定义如下:

    public final QPoint mapTo(QWidget widget,QPoint point) { ... }

          因为Java中没有指针,所以在函数定义中并不能看出传递给函数的对象是否可以被函数修改。理论上来说,因为两个参数都是引用,mapTo()函数可以修改其中的任一个,但Qt Jambi不允许修改QPoint参数,因为在C++中QPoint是作为常量引用传递的。通常根据上下文信息可以清楚的判断出哪些参数可以改变哪些不能改变。如有疑问,可以查阅参考文档理清这种情况。

          除了在C++中那些作为常量值或常量引用传递的不可变参数外,Qt Jambi还保证了任何非void函数的返回值是一个独立的副本(在C++中函数返回值都是常量值或常量引用),因此改变函数返回值不会有任何限制。

          前面提到过,C++/Qt中任何用到QString的地方,在Qt Jambi中都用Java的String代替。这种对应关系同样适用于QChar类,在Qt Jambi中有两个Java的对应类:char和java.lang.Character。对于Qt的一些容器类也有类似的对应关系:QHash被替换为java.util.HashMap,QList和QVector被替换为java.util.List,QMap被替换为java.util.SortedMap。此外,QThread被替换为java.lang.Thread。

          Qt的模型/视图架构和数据库API使QVariant得到了广泛应用。因为所有的Java对象都继承自java.lang.Object,所以Java中并不需要这种类型,在所有的Qt Jambi的API中,QVariant被替换为java.lang.Object。QVariant提供的其他函数可以在com.trolltech.qt.QVariant中以静态函数的方式使用。

          我们已经结束了对Qt Jambi小程序的介绍,并讨论了很多Qt Jambi和C++/Qt在编程方便的概念上的差别。编译运行Qt Jambi应用程序与其他Java程序无异,但是要设置CLASSPATH环境变量指向Qt Jambi的安装路径。我们必须用Java编译器编译程序才能用Java解释器运行程序。比如:

    exportCLASSPATH=$CLASSPATH:$HOME/qtjambi/qtjambi.jar:$PWD

    javac FindDialog.java

    java FindDialog

          这里,我们使用Bash shell设置CLASSPATH环境变量值;如果使用其他命令行解释器,其语法可能与此不同。CLASSPATH中包含了当前文件夹,这样编译器和解释器就可以自动找到FindDialog类了。在Mac OS X系统中,必须将命令行选项-XstartOnFirstThread分配给Java,以通过Apple的Java虚拟机处理线程相关事务。在Windows系统中,我们这样执行应用程序:

    setCLASSPATH=%CLASSPATH%;%JAMBIPATH%\qtjambi.jar;%CD%

    javac FindDialog.java

    java FindDialog

          QtJambi也可以在IDE中使用。下节将介绍如何用著名的Eclipse IDE编辑、编译、测试Qt Jambi应用程序。


    微信公众号:Qt开发社区(期待您的关注,扫下方二维码或搜索“Qt开发社区”或"Qtkfsq")

    投 稿 邮 箱 :luxingcan@aliyun.com


    展开全文
  • 软件工程知识

    2012-12-02 21:34:25
    概要设计是针对软件系统结构设计,用于从总体上对软件构造、接口、全局数据结构数据环境等给出设计说明,并以“概要设计说明书”形式提交书面报告,其结果将成为详细设计与系统集成基本依据。 模块是概要...
  • (2)单击“线条粗细”下拉列表 右端向下箭头,弹出调节滑标,如图2-26所示,利用滑标的上下移动来调节线条粗细,显示窗口中对应地显示线条粗细数值。 2-16示滑标 (3)单击“线条样式”下拉列表 右端...
  • 右键,直接AddEventsHandler就好啦 原来ClassWizzard功能现在...比如:提前设置好,在为对话框添加类时候,使对话框的ID尽量类名相同/相近,之后按照名字来查找。 而在其他版本VS中,则可以通过类向...
  •  导入时出现两个对话框,一个是问是否导入(肯定选是了),另一个是导入成功的对话框确定了!  三、在新系统PATH中加入ORACLEBIN路径:  方法:  在新系统中,我电脑->鼠标右键->属性,出现系统属性窗口;...
  • excel使用

    2012-11-25 17:06:01
    想要快速知道每个单元格中公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图”选项卡,接着设置“窗口选项”栏下“公式”项有效,单击“确定...
  • 可以在“工具”菜单设置文件关联、自定义菜单工具栏、管理常用工具插件等(如图2),点击“工具/自定义”可以打开自定义窗口(如图2),这里提供了众多选项,我们能够通过设置让EmEditor更加符合自己使用习惯...
  • 14.2.1 ActiveX 控件普通Windows 控件的相同点 14.2.2 ActiveX 控件普通Windows 控件的相同点 14.3 ActiveX 控件的属性、方法事件 14.3.1 ActiveX 控件的属性 14.3.2 ActiveX 控件的方法 14.3.3 ActiveX ...
  • 一款非常好WPF编程宝典2010 源代码

    热门讨论 2014-04-14 09:57:41
    8.4.2 任务对话框和文件对话框 202 8.5 结束语 204 第9章 页面和导航 205 9.1 理解基于页面导航 205 9.2 基于页面用户界面 206 9.2.1 一个具有导航功能基于 页面简单应用程序 206 9.2.2 Page类 208 ...
  • WPS 2000 在提供了符合标准 Windows 95 界面的菜单、工具条、状态行、多文档窗口用户界面的同时,文档窗口的水平垂直两个方向的标尺可方便地用于排版操作,并在文档各个对象上支持上下文相关的右键快捷菜单。...
  • 尽我所知,除了文中特别加以标注致谢地方外,论文中不包含其他人已经发表或撰写过研究成果,也不包含为获得东南大学或其它教育机构学位或证书而使用过材料。与我一同工作同志对本研究所做任何贡献均已...
  • PT80-NEAT开发指南v1.1

    2014-06-24 18:38:34
    窗口的创建删除 ................................................................................................................................ 22 窗口类型 .............................................
  • WINRAR5.0正式注册版

    2013-10-10 10:14:03
    NTFS 符号链接分析为链接,它们内容没有被压缩。此选项命令行等价开关是 -ol。 NTFS 硬链接类似选项是“把硬链接保存为链接”。它命令行等价开关是 -oh。 这两个选项仅可用于 RAR 5.0 压缩文件...
  • LINGO软件学习

    2009-08-08 22:36:50
    外层是主框架窗口,包含了所有菜单命令工具条,其它所有的窗口将被包含在主窗口之下。在主窗口标题为LINGO Model – LINGO1的窗口是LINGO默认模型窗口,建立模型都都要在该窗口内编码实现。下面举两个例子...
  • 五、控制面板→管理工具→本地安全策略→本地策略→安全选项里,把“网络访问:本地帐户共享安全模式”设为“仅来宾-本地用户以来宾身份验证”(可选,此项设置可去除访问时要求输入密码的对话框,也可视情况...
  • 比如,两个相同行业不同地区人使用同一个DTD文件来作为文档创建规范,那么他们数据就很容易交换共享。网上有其他人想补充数据,也只需要根据公用DTD规范来建立文档,就立刻可以加入。 目前,已经有数量众多...
  • 如何重置窗口的大小位置 如何将文本倾斜显示 如何制作立体字体 串太长如何在末尾显示省略号 如何在对话框中加入工具条 如何在基于文档视图的工程中加入启动画面 如何在基于对话框的工程中使用Splash 如何在对话框...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 185
精华内容 74
关键字:

对话框和窗口的相同点