怎么实现点击qss qtabwidgett分页的标题栏右键菜单

Android UI设计与开发(20)
转载自:http://blog.csdn.net/youngkingyj/article/details/
1. 第一种,使用 TabHost + ViewPager 实现
该方法会有一个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显示(准确的说是加载),只有点击其他任意一个tab后才会加载。
有解的同学吼一声~~~~~~~
package com.swordy.demo.android.
import java.util.R
import android.os.B
import android.support.v4.app.F
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentStatePagerA
import android.support.v4.view.PagerA
import android.support.v4.view.ViewP
import android.support.v4.view.ViewPager.OnPageChangeL
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.TabH
import android.widget.TabHost.OnTabChangeL
import android.widget.TabW
import android.widget.TextV
import com.swordy.demo.android.R;
import com.swordy.library.android.util.EL
&* 1. 使用TabHost和ViewPager组合实现一个可以滑动的tab
&* 2. bug:如果当前页为0,则ViewPager第一次不加载。
&* @author swordy
&* @since Jan 20, 2014
&* @version 1.0
public class SlideTabs1 extends FragmentActivity
&&& private static final String TAG = &AndroidDemos.SlideTabs1&;
&&& private TabHost mTabH
&&& private ViewPager mViewP
&&& private PagerAdapter mPagerA
&&& private String[] addresses = { &first&, &second&, &third& };
&&& @Override
&&& protected void onCreate(Bundle arg0)
&&&&&&& super.onCreate(arg0);
&&&&&&& setContentView(R.layout.fragment_slidetabs1);
&&&&&&& mViewPager = (ViewPager) findViewById(R.id.viewPager1);
&&&&&&& mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
&&&&&&& mViewPager.setAdapter(mPagerAdapter);
&&&&&&& mTabHost = (TabHost) findViewById(android.R.id.tabhost);
&&&&&&& mTabHost.setup();
&&&&&&& mTabHost.addTab(mTabHost.newTabSpec(&one&).setIndicator(&one-1&)
&&&&&&&&&&&&&&& .setContent(R.id.viewPager1));
&&&&&&& mTabHost.addTab(mTabHost.newTabSpec(&two&).setIndicator(&two-2&)
&&&&&&&&&&&&&&& .setContent(R.id.viewPager1));
&&&&&&& mTabHost.addTab(mTabHost.newTabSpec(&three&).setIndicator(&three-3&)
&&&&&&&&&&&&&&& .setContent(R.id.viewPager1));
&&&&&&& TabWidget tabWidget = mTabHost.getTabWidget();
&&&&&&& int count = tabWidget.getChildCount();
&&&&&&& for (int i = 0; i != i++)
&&&&&&&&&&& final int index =
&&&&&&&&&&& tabWidget.getChildAt(i).setOnClickListener(new OnClickListener() {
&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&& public void onClick(View v)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& mTabHost.setCurrentTab(index);
&&&&&&&&&&&&&&&&&&& mViewPager.setCurrentItem(index);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& });
&&&&&&& mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onTabChanged(String tabId)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& ELog.i(TAG, &@--& onTabChanged by tabId: & + tabId);
&&&&&&&&&&& }
&&&&&&& });
&&&&&&& mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onPageSelected(int arg0)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& ELog.i(TAG, &@--& onPageSelected: & + arg0);
&&&&&&&&&&&&&&& mTabHost.setCurrentTab(arg0);
&&&&&&&&&&& }
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onPageScrolled(int arg0, float arg1, int arg2)
&&&&&&&&&&& {
&&&&&&&&&&& }
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onPageScrollStateChanged(int arg0)
&&&&&&&&&&& {
&&&&&&&&&&& }
&&&&&&& });
&&& private class MyPagerAdapter extends FragmentStatePagerAdapter
&&&&&&& public MyPagerAdapter(FragmentManager fm)
&&&&&&&&&&& super(fm);
&&&&&&& @Override
&&&&&&& public Fragment getItem(int position)
&&&&&&&&&&& ELog.i(TAG, &@--& getItem by position& + position);
&&&&&&&&&&& ELog.i(TAG, &@--& getItem by position& + position);
&&&&&&&&&&& return MyFragment.create(addresses[position]);
&&&&&&& @Override
&&&&&&& public int getCount()
&&&&&&&&&&& return addresses.
&&& public static class MyFragment extends Fragment
&&&&&&& public static MyFragment create(String address)
&&&&&&&&&&& ELog.i(TAG, &@--& MyFragment.create()&);
&&&&&&&&&&& MyFragment f = new MyFragment();
&&&&&&&&&&& Bundle b = new Bundle();
&&&&&&&&&&& b.putString(&address&, address);
&&&&&&&&&&& f.setArguments(b);
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public View onCreateView(LayoutInflater inflater, ViewGroup container,
&&&&&&&&&&&&&&& Bundle savedInstanceState)
&&&&&&&&&&& Random r = new Random(System.currentTimeMillis());
&&&&&&&&&&& Bundle b = getArguments();
&&&&&&&&&&& View v = inflater.inflate(R.layout.fragment_viewpager1_layout1, null);
&&&&&&&&&&& v.setBackgroundColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& TextView txvAddress = (TextView) v.findViewById(R.id.textView1);
&&&&&&&&&&& txvAddress.setTextColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& txvAddress.setBackgroundColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& txvAddress.setText(b.getString(&address&, &&));
&&&&&&&&&&&
&?xml version=&1.0& encoding=&utf-8&?&
&TabHost xmlns:android=&/apk/res/android&
&&& android:id=&@android:id/tabhost&
&&& android:layout_width=&match_parent&
&&& android:layout_height=&match_parent& &
&&& &LinearLayout
&&&&&&& android:layout_width=&match_parent&
&&&&&&& android:layout_height=&match_parent&
&&&&&&& android:orientation=&vertical& &
&&&&&&& &TabWidget
&&&&&&&&&&& android:id=&@android:id/tabs&
&&&&&&&&&&& android:layout_width=&match_parent&
&&&&&&&&&&& android:layout_height=&wrap_content&
&&&&&&&&&&& android:gravity=&right|center_vertical& /&
&&&&&&& &FrameLayout
&&&&&&&&&&& android:id=&@android:id/tabcontent&
&&&&&&&&&&& android:layout_width=&match_parent&
&&&&&&&&&&& android:layout_height=&match_parent& &
&&&&&&&&&&& &android.support.v4.view.ViewPager
&&&&&&&&&&&&&&& android:id=&@+id/viewPager1&
&&&&&&&&&&&&&&& android:layout_width=&match_parent&
&&&&&&&&&&&&&&& android:layout_height=&match_parent& /&
&&&&&&& &/FrameLayout&
&&& &/LinearLayout&
&/TabHost&
2. 第二种,使用官方提供的方法 ActionBar + ViewPager 实现
该方法有两个缺陷,或者说不是缺陷,只是我没有找到解决的办法。
第一,tab点上不是很灵敏,可能就是这么设定的,为了防止频繁加载吧,但是体验稍稍不爽;
第二,ActionBar在最顶部,如果我的布局是:顶部一个带返回按钮的标题栏,中间是tab,底部是tabcontent,怎么搞?
Activity:
package com.swordy.demo.android.
import java.util.R
import android.app.ActionB
import android.app.ActionBar.T
import android.app.ActionBar.TabL
import android.os.B
import android.support.v4.app.F
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentPagerA
import android.support.v4.view.ViewP
import android.support.v4.view.ViewPager.OnPageChangeL
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.TextV
import com.swordy.demo.android.R;
&* 1. 使用ActionBar和ViewPager实现可以滑动的Tab
&* @author swordy
&* @since Jan 20, 2014
&* @version 1.0
public class SlideTabs2 extends FragmentActivity
&&& private static final String TAG = &AndroidDemos.SlideTabs2&;
&&& private ViewPager mViewP
&&& private ActionBar mActionB
&&& private MyPagerAdapter mPagerA
&&& private String[] addresses = { &first&, &second&, &third& };
&&& private Tab[] mTabs = new Tab[addresses.length];
&&& @Override
&&& protected void onCreate(Bundle savedInstanceState)
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.fragment_viewpager1);
&&&&&&& mViewPager = (ViewPager) findViewById(R.id.viewPager1);
&&&&&&& mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
&&&&&&& mViewPager.setAdapter(mPagerAdapter);
&&&&&&& mViewPager.setOnPageChangeListener(mPageChangeListener);
&&&&&&& mActionBar = getActionBar();
&&&&&&& mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
&&&&&&& mActionBar.setDisplayShowTitleEnabled(false);
&&&&&&& mActionBar.setDisplayShowHomeEnabled(false);
&&&&&&& for (int i = 0; i != addresses. i++)
&&&&&&&&&&& mTabs[i] = mActionBar.newTab().setText(addresses[i]).setTabListener(mTabListener);
&&&&&&&&&&& mActionBar.addTab(mTabs[i]);
&&& private OnPageChangeListener mPageChangeListener = new OnPageChangeListener() {
&&&&&&& @Override
&&&&&&& public void onPageSelected(int arg0)
&&&&&&&&&&& mActionBar.setSelectedNavigationItem(arg0);
&&&&&&& @Override
&&&&&&& public void onPageScrolled(int arg0, float arg1, int arg2)
&&&&&&& @Override
&&&&&&& public void onPageScrollStateChanged(int arg0)
&&& private TabListener mTabListener = new TabListener() {
&&&&&&& @Override
&&&&&&& public void onTabSelected(Tab tab, android.app.FragmentTransaction ft)
&&&&&&&&&&& if (tab == mTabs[0])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& mViewPager.setCurrentItem(0);
&&&&&&&&&&& } else if (tab == mTabs[1])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& mViewPager.setCurrentItem(1);
&&&&&&&&&&& } else if (tab == mTabs[2])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& mViewPager.setCurrentItem(2);
&&&&&&&&&&& }
&&&&&&& @Override
&&&&&&& public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft)
&&&&&&&&&&& // TODO Auto-generated method stub
&&&&&&& @Override
&&&&&&& public void onTabReselected(Tab tab, android.app.FragmentTransaction ft)
&&&&&&&&&&& // TODO Auto-generated method stub
&&& public class MyPagerAdapter extends FragmentPagerAdapter
&&&&&&& public MyPagerAdapter(FragmentManager fm)
&&&&&&&&&&& super(fm);
&&&&&&& @Override
&&&&&&& public Fragment getItem(int position)
&&&&&&&&&&& return MyFragment.create(addresses[position]);
&&&&&&& @Override
&&&&&&& public int getCount()
&&&&&&&&&&& return addresses.
&&& public static class MyFragment extends Fragment
&&&&&&& public static MyFragment create(String address)
&&&&&&&&&&& MyFragment f = new MyFragment();
&&&&&&&&&&& Bundle b = new Bundle();
&&&&&&&&&&& b.putString(&address&, address);
&&&&&&&&&&& f.setArguments(b);
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public View onCreateView(LayoutInflater inflater, ViewGroup container,
&&&&&&&&&&&&&&& Bundle savedInstanceState)
&&&&&&&&&&& Random r = new Random(System.currentTimeMillis());
&&&&&&&&&&& Bundle b = getArguments();
&&&&&&&&&&& View v = inflater.inflate(R.layout.fragment_viewpager1_layout1, null);
&&&&&&&&&&& v.setBackgroundColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& TextView txvAddress = (TextView) v.findViewById(R.id.textView1);
&&&&&&&&&&& txvAddress.setTextColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& txvAddress.setBackgroundColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& txvAddress.setText(b.getString(&address&, &&));
&&&&&&&&&&&
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
&&& android:layout_width=&match_parent&
&&& android:layout_height=&match_parent&
&&& android:orientation=&vertical& &
&&& &android.support.v4.view.ViewPager
&&&&&&& android:id=&@+id/viewPager1&
&&&&&&& android:layout_width=&match_parent&
&&&&&&& android:layout_height=&match_parent& /&
&/LinearLayout&
3. 【推荐】第三种,使用 TabWidget + ViewPager 实现
该方法不错,推荐使用。
Activity:
package com.swordy.demo.android.
import java.util.R
import android.os.B
import android.support.v4.app.F
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentStatePagerA
import android.support.v4.view.PagerA
import android.support.v4.view.ViewP
import android.support.v4.view.ViewPager.OnPageChangeL
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.B
import android.widget.TabW
import android.widget.TextV
import com.swordy.demo.android.R;
&* 1. 使用TabWidget和ViewPager实现可滑动的Tab
&* @author swordy
&* @since Jan 20, 2014
&* @version 1.0
public class SlideTabs3 extends FragmentActivity
&&& private static final String TAG = &AndroidDemos.SlideTabs3&;
&&& private ViewPager mViewP
&&& private PagerAdapter mPagerA
&&& private TabWidget mTabW
&&& private String[] addresses = { &first&, &second&, &third& };
&&& private Button[] mBtnTabs = new Button[addresses.length];
&&& @Override
&&& protected void onCreate(Bundle savedInstanceState)
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.fragment_slidetabs3);
&&&&&&& mTabWidget = (TabWidget) findViewById(R.id.tabWidget1);
&&&&&&& mTabWidget.setStripEnabled(false);
&&&&&&& mBtnTabs[0] = new Button(this);
&&&&&&& mBtnTabs[0].setFocusable(true);
&&&&&&& mBtnTabs[0].setText(addresses[0]);
&&&&&&& mBtnTabs[0].setTextColor(getResources().getColorStateList(R.color.button_bg_color_selector));
&&&&&&& mTabWidget.addView(mBtnTabs[0]);
&&&&&&& /*&
&&&&&&&& * Listener必须在mTabWidget.addView()之后再加入,用于覆盖默认的Listener,
&&&&&&&& * mTabWidget.addView()中默认的Listener没有NullPointer检测。
&&&&&&&& */
&&&&&&& mBtnTabs[0].setOnClickListener(mTabClickListener);
&&&&&&& mBtnTabs[1] = new Button(this);
&&&&&&& mBtnTabs[1].setFocusable(true);
&&&&&&& mBtnTabs[1].setText(addresses[1]);
&&&&&&& mBtnTabs[1].setTextColor(getResources().getColorStateList(R.color.button_bg_color_selector));
&&&&&&& mTabWidget.addView(mBtnTabs[1]);
&&&&&&& mBtnTabs[1].setOnClickListener(mTabClickListener);
&&&&&&& mBtnTabs[2] = new Button(this);
&&&&&&& mBtnTabs[2].setFocusable(true);
&&&&&&& mBtnTabs[2].setText(addresses[2]);
&&&&&&& mBtnTabs[2].setTextColor(getResources().getColorStateList(R.color.button_bg_color_selector));
&&&&&&& mTabWidget.addView(mBtnTabs[2]);
&&&&&&& mBtnTabs[2].setOnClickListener(mTabClickListener);
&&&&&&& mViewPager = (ViewPager) findViewById(R.id.viewPager1);
&&&&&&& mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
&&&&&&& mViewPager.setAdapter(mPagerAdapter);
&&&&&&& mViewPager.setOnPageChangeListener(mPageChangeListener);
&&&&&&& mTabWidget.setCurrentTab(0);
&&& private OnClickListener mTabClickListener = new OnClickListener() {
&&&&&&& @Override
&&&&&&& public void onClick(View v)
&&&&&&&&&&& if (v == mBtnTabs[0])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& mViewPager.setCurrentItem(0);
&&&&&&&&&&& } else if (v == mBtnTabs[1])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& mViewPager.setCurrentItem(1);
&&&&&&&&&&& } else if (v == mBtnTabs[2])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& mViewPager.setCurrentItem(2);
&&&&&&&&&&& }
&&& private OnPageChangeListener mPageChangeListener = new OnPageChangeListener() {
&&&&&&& @Override
&&&&&&& public void onPageSelected(int arg0)
&&&&&&&&&&& mTabWidget.setCurrentTab(arg0);
&&&&&&& @Override
&&&&&&& public void onPageScrolled(int arg0, float arg1, int arg2)
&&&&&&& @Override
&&&&&&& public void onPageScrollStateChanged(int arg0)
&&& private class MyPagerAdapter extends FragmentStatePagerAdapter
&&&&&&& public MyPagerAdapter(FragmentManager fm)
&&&&&&&&&&& super(fm);
&&&&&&& @Override
&&&&&&& public Fragment getItem(int position)
&&&&&&&&&&& return MyFragment.create(addresses[position]);
&&&&&&& @Override
&&&&&&& public int getCount()
&&&&&&&&&&& return addresses.
&&& public static class MyFragment extends Fragment
&&&&&&& public static MyFragment create(String address)
&&&&&&&&&&& MyFragment f = new MyFragment();
&&&&&&&&&&& Bundle b = new Bundle();
&&&&&&&&&&& b.putString(&address&, address);
&&&&&&&&&&& f.setArguments(b);
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public View onCreateView(LayoutInflater inflater, ViewGroup container,
&&&&&&&&&&&&&&& Bundle savedInstanceState)
&&&&&&&&&&& Random r = new Random(System.currentTimeMillis());
&&&&&&&&&&& Bundle b = getArguments();
&&&&&&&&&&& View v = inflater.inflate(R.layout.fragment_viewpager1_layout1, null);
&&&&&&&&&&& v.setBackgroundColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& TextView txvAddress = (TextView) v.findViewById(R.id.textView1);
&&&&&&&&&&& txvAddress.setTextColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& txvAddress.setBackgroundColor(r.nextInt() && 8 | 0xFF && 24);
&&&&&&&&&&& txvAddress.setText(b.getString(&address&, &&));
&&&&&&&&&&&
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
&&& android:layout_width=&match_parent&
&&& android:layout_height=&match_parent&
&&& android:orientation=&vertical& &
&&& &TabWidget
&&&&&&& android:id=&@+id/tabWidget1&
&&&&&&& android:layout_width=&match_parent&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:gravity=&right|center_vertical& /&
&&& &android.support.v4.view.ViewPager
&&&&&&& android:id=&@+id/viewPager1&
&&&&&&& android:layout_width=&match_parent&
&&&&&&& android:layout_height=&match_parent& /&
&/LinearLayout&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45344次
排名:千里之外
原创:27篇
转载:118篇
(7)(5)(56)(55)(19)(1)(2)Qt中 QDockWidget的自定义标题栏 以及 tab页的位置 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 15时,
Qt菜鸟,想用Qt实现一些自己写的小功能,当用到QDockWidget时候,想实现一个自定义的标题栏,上网上狂搜啊,结果都是“大神”说的一些类似&自己画一个就好了&的方式,对于我这样的小白来说,真是要多难有多难,结果根据Qt自带的例子中的一个样例,琢磨着弄出来一个大致的功能,提供思路供跟我一样的小白们参考,目前仅仅是实现了样式上的功能,在各种考虑上都还欠缺(例如标题栏的双击功能就没有实现)。
代码片段(8)
1.&[代码]myDockTitleBar.h&&&&
#ifndef MYDOCKTITLEBAR_H
#define MYDOCKTITLEBAR_H
#include &QSize&
#include &QDockWidget&
#include &QMouseEvent&
#include &QWidget&
#include &QPainter&
#include &QPaintEvent&
#include "qdebug.h"
#include &QStyle&
class MyDockTitleBar : public QWidget
MyDockTitleBar(QWidget *parent = 0);
QSize sizeHint() const { return minimumSizeHint(); }
QSize minimumSizeHint()
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
public slots:
void updateMask();
QPixmap minPix, closePix, floatP
#endif // MYDOCKTITLEBAR_H
2.&[代码]myDockTitleBar.cpp&&&&
#include "myDockTitleBar.h"
MyDockTitleBar::MyDockTitleBar(QWidget *parent)
: QWidget(parent)
minPix = style()-&standardPixmap(QStyle::SP_TitleBarMinButton);
= style()-&standardPixmap(QStyle::SP_TitleBarCloseButton);
floatPix = style()-&standardPixmap(QStyle::SP_TitleBarNormalButton);
QSize MyDockTitleBar::minimumSizeHint() const
QDockWidget *dw = qobject_cast&QDockWidget*&(parentWidget());
Q_ASSERT(dw != 0);
QSize result(200, 35);
if (dw-&features() & QDockWidget::DockWidgetVerticalTitleBar)
result.transpose();
void MyDockTitleBar::paintEvent(QPaintEvent*)
QPainter painter(this);
QRect rect = this-&rect();
QDockWidget *dw = qobject_cast&QDockWidget*&(parentWidget());
Q_ASSERT(dw != 0);
if (dw-&features() & QDockWidget::DockWidgetVerticalTitleBar) {
QSize s = rect.size();
s.transpose();
rect.setSize(s);
painter.translate(rect.left(), rect.top() + rect.width());
painter.rotate(-90);
painter.translate(-rect.left(), -rect.top());
painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), QColor(tr("white")));
painter.drawPixmap(rect.topRight() - QPoint(closePix.width() + 10, -10), closePix);
painter.drawPixmap(rect.topRight() - QPoint(minPix.width() + 10 + closePix.width() + 10, -7), minPix);
painter.drawPixmap(rect.topRight() - QPoint(floatPix.width() + 10 + minPix.width() + 10
+ closePix.width() + 10, -10), floatPix);
void MyDockTitleBar::mousePressEvent(QMouseEvent *event)
QPoint pos = event-&pos();
QRect rect = this-&rect();
QDockWidget *dw = qobject_cast&QDockWidget*&(parentWidget());
Q_ASSERT(dw != 0);
if (dw-&features() & QDockWidget::DockWidgetVerticalTitleBar) {
QPoint p =
pos.setX(rect.left() + rect.bottom() - p.y());
pos.setY(rect.top() + p.x() - rect.left());
QSize s = rect.size();
s.transpose();
rect.setSize(s);
const int buttonRight = 10;
const int buttonWidth = 20;
int right = rect.right() - pos.x();
int button = (right - buttonRight)/buttonW
qDebug() && rect.right() && " --- " && pos.x() && " --- " && right && " --- " &&
switch (button) {
event-&accept();
dw-&close();
event-&accept();
dw-&setFloating(!dw-&isFloating());
event-&accept();
QDockWidget::DockWidgetFeatures features = dw-&features();
if (features & QDockWidget::DockWidgetVerticalTitleBar)
features &= ~QDockWidget::DockWidgetVerticalTitleB
features |= QDockWidget::DockWidgetVerticalTitleB
dw-&setFeatures(features);
event-&ignore();
void MyDockTitleBar::updateMask()
QDockWidget *dw = qobject_cast&QDockWidget*&(parent());
Q_ASSERT(dw != 0);
QRect rect = dw-&rect();
QPixmap bitmap(dw-&size());
QPainter painter(&bitmap);
///initialize to transparent
painter.fillRect(rect, Qt::color0);
QRect contents =
contents.setTopLeft(geometry().bottomLeft());
contents.setRight(geometry().right());
contents.setBottom(contents.bottom()-y());
painter.fillRect(contents, Qt::color1);
//let's pait the titlebar
QRect titleRect = this-&geometry();
if (dw-&features() & QDockWidget::DockWidgetVerticalTitleBar) {
QSize s = rect.size();
s.transpose();
rect.setSize(s);
QSize s2 = size();
s2.transpose();
titleRect.setSize(s2);
painter.translate(rect.left(), rect.top() + rect.width());
painter.rotate(-90);
painter.translate(-rect.left(), -rect.top());
contents.setTopLeft(titleRect.bottomLeft());
contents.setRight(titleRect.right());
contents.setBottom(rect.bottom()-y());
QRect rect = titleR
painter.drawPixmap(rect.topLeft(), leftPm.mask());
painter.fillRect(rect.left() + leftPm.width(), rect.top(),
rect.width() - leftPm.width() - rightPm.width(),
centerPm.height(), Qt::color1);
painter.drawPixmap(rect.topRight() - QPoint(rightPm.width() - 1, 0), rightPm.mask());
painter.fillRect(contents, Qt::color1);
dw-&setMask(bitmap);
3.&[代码]mainwindow.h&&&&
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
#include &QWidget&
namespace Ui {
class MainW
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *
#endif // MAINWINDOW_H
4.&[代码]mainwindow.cpp&&&&
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myDockTitleBar.h"
#include &QDockWidget&
#include &QToolButton&
#include &QPushButton&
#include &QVBoxLayout&
#include &QMdiSubWindow&
#include &QFrame&
#include &QDebug&
#include &QPainter&
#include &QMouseEvent&
#include &QBitmap&
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
QDockWidget *testDock = new QDockWidget(tr("Test Dock"));
testDock-&setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable
| QDockWidget::DockWidgetMovable);
testDock-&setMinimumWidth(200);
testDock-&setStyleSheet(tr("background-color:"));
MyDockTitleBar *titlebar1 = new MyDockTitleBar(testDock);
testDock-&setTitleBarWidget(titlebar1);
QWidget *testWidget = new QW
QVBoxLayout *box = new QVBoxL
QPushButton *okButton = new QPushButton(tr("Ok"));
okButton-&setStyleSheet(tr("background-color:"));
box-&addWidget(okButton);
testWidget-&setLayout(box);
testDock-&setWidget(testWidget);
//////////////////////////////////////////////////////////
QDockWidget *testDock2 = new QDockWidget(tr("Test Dock2"));
testDock2-&setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable
| QDockWidget::DockWidgetMovable);
testDock2-&setMinimumWidth(200);
testDock2-&setStyleSheet(tr("background-color:"));
MyDockTitleBar *titlebar2 = new MyDockTitleBar(testDock2);
testDock2-&setTitleBarWidget(titlebar2);
QWidget *testWidget2 = new QW
QVBoxLayout *box2 = new QVBoxL
QPushButton *okButton2 = new QPushButton(tr("Ok"));
okButton2-&setStyleSheet(tr("background-color:"));
box2-&addWidget(okButton2);
testWidget2-&setLayout(box2);
testDock2-&setWidget(testWidget2);
//////////////////////////////////////////////////////////
this-&addDockWidget(Qt::LeftDockWidgetArea, testDock);
this-&setTabPosition(Qt::LeftDockWidgetArea, QTabWidget::West);
this-&tabifyDockWidget(testDock, testDock2);
MainWindow::~MainWindow()
5.&[代码]main.cpp&&&&
#include "mainwindow.h"
#include &QApplication&
int main(int argc, char *argv[])
QApplication a(argc, argv);
return a.exec();
6.&[代码]testDock.pro&&&&
#-------------------------------------------------
# Project created by QtCreator T12:59:04
#-------------------------------------------------
+= core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = testDock
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
myDockTitleBar.cpp
+= mainwindow.h \
myDockTitleBar.h
mainwindow.ui
7.&[代码]mainwindow.ui&&&&
&?xml version="1.0" encoding="UTF-8"?&
&ui version="4.0"&
&class&MainWindow&/class&
&widget class="QMainWindow" name="MainWindow"&
&property name="geometry"&
&width&640&/width&
&height&480&/height&
&/property&
&property name="windowTitle"&
&string&MainWindow&/string&
&/property&
&widget class="QWidget" name="centralwidget"/&
&widget class="QMenuBar" name="menubar"&
&property name="geometry"&
&width&640&/width&
&height&19&/height&
&/property&
&widget class="QStatusBar" name="statusbar"/&
&resources/&
&connections/&
8.&[图片] testDock.png&&&&
开源中国-程序员在线工具:
相关的代码(88)
65回/20053阅
14回/17188阅
36回/13531阅
18回/12680阅
9回/12394阅
33回/11942阅
9回/11116阅
8回/9452阅
5回/8978阅
1回/8121阅
谢谢楼主分享!
2楼:ktztysj 发表于
哥,你都知道初学者开始学这个很痛苦,首先非常感谢贡献代码,关键能否加点注释
3楼:相思苦闷 发表于
C语言/C++学习指南(Qt界面开发篇)&
课程观看:
课程出自学途无忧网:
第 1 章 : 开始学习 Getting Started
课时1:Qt开发环境的搭建
课时2:第一个窗口程序HelloWorld 22:13
课时3:Visual Assist的设置&
第 2 章 : 初步认识窗体 Know The Widget
课时4:认识各种窗体&
课时5:窗口坐标&
课时6:定义一个窗口&
第 3 章 : 窗口的布局 Layout Of Widget
课时7:窗口的布局&
课时8:窗口大小调整的策略&
课时9:可视化布局&
课时10:可视化布局的代码生成过程&
课时11:更多布局参数
第 4 章 : 事件处理 Handle The Events
课时12:事件处理机制&
课时13:connect的几种常见错误写法
第 5 章 : 常见控件的基本用法 Usage Of Common Controls
课时14:复选框QCheckBox&
课时15:单行文本框QLineEdit&
课时16:组合框QComboBox&
课时17:工具按钮QToolButton&
课时18:QLabel显示文字和图片
第 6 章 : 字符串的处理 String In Qt
课时19:拉丁字符集 (ISO 8859)&
课时20:中文字符集 (GBK, UnicodeUTF8)&
课时21:VC下字符编码的转换(不是Qt下的转换)&
课时22:Qt中的字符串类QString
第 7 章 : 对话框 Dialog
课时23:模式对话框
课时24:文件对话框&
课时25:Qt项目的目录结构优化【重要】&
课时26:非模式窗口&
第 8 章 : Qt中的多线程技术 Multi-Threading In Qt
课时27:界面线程与工作线程
课时28:定时器&
课时29:使用工作线程&
课时30:【实战004】抽奖器&
第 9 章 : 容器窗口 The Containers
课时31:选项卡窗口 QTabWidget&
课时32:堆叠窗口 QStackedWidget&
第 10 章 : 主窗口 The Main Window
课时33:工具栏和菜单&
课时34:单文档界面&
课时35:可停靠窗口&
第 11 章 : 自定义控件 Customize the Widget
课时36:窗口的绘制(1)基本方法
课时37:窗口的绘制(2)几何图形的绘制&
课时38:窗口的绘制(3)动画的实现&
课时39:窗口的绘制(4)文字的绘制
课时40:窗口的绘制(5)图片的绘制
课时41:鼠标的支持(1)基本概念&
课时42:鼠标的支持(2)发射信号&
第 12 章 : 树,列表和表格 The Item Views
课时43:列表控件的使用方法(1)
课时44:列表控件的使用方法(2)&
课时45:列表控件 - 自定义显示&
课时46:列表控件 - 原位编辑&
课时47:列表控件 - 右键菜单&
课时48:树形控件与表格控件&
课时49:【实战002】学生信息管理(基于File的实现)&
课时50:【实战006】聊天室&
第 13 章 : 拖放技术 Drag & Drop
课时51:接受拖放 Accept a drag&
课时52:发起拖放 Start a drag&
课时53:【实战001】棋盘游戏&
第 14 章 : 界面的样式(皮肤) Qt Stylesheet
课时54:StyleSheet的基本用法
课时55:StyleSheet的语法 - Selector&
课时56:【实战005】密码本
第 15 章 : 杂项 Miscellaneous
课时57:杂项 Miscellaneous
课时58:全局快捷键&
第 16 章 : Linux下Qt的使用 Qt Under Linux
课时59:Qt的项目组成
开源从代码分享开始
simananzhui的其它代码

我要回帖

更多关于 qtabwidget 的tab样式 的文章

 

随机推荐